имеют свой адрес но при этом ни на какой адрес в памяти не указывают и потом попытался вывести значение которое хранится по тому несуществующему адресу?я правильно понимаю?
Разыменование nullptr в Стандарте обозначено как UB (undefined behavoir, неопределённое поведение), то есть, что именно произойдёт от разыменования nullptr зависит от ОС, компилятора, архитектуры процессора и проч, и проч, но никак самим языком не определяется
Если ты знаешь, как тот или иной код поведёт себя в определённой среде — можешь рассчитывать на такое поведение, но в целом UB в коде следует избегать любой ценой
а то что я сказал имеет смысл?
Как минимум потому что ты скорее всего не будешь знать, как этот код будет работать в другой среде, и портировать такой код или запускать его на разных платформах сложно
просто интересно
nullptr — это специальный указатель на специальную область в памяти, которая определяет указатель как "нулевой"
То есть я впринцепе правильно понял,то есть я обращаюсь непонятно к чему и соответственно получаю только Богу известно что
Агап И поэтому лучше так не делать
>> Если ты знаешь, как тот или иной код поведёт себя в определённой среде Это касается в лучшем случае implementation-defined behavior. В случае UB же мы по определению не знаем, как поведет себя код, ведь его поведение может меняться в зависимости от фазы Луны, погоды на Марсе или от геополитической обстановки на спутниках Сатурна
Есть ещё unspecified behavior, там тоже можно ;)
Вообще, я не уверен, что unspecified behavior гарантирует детерминированное поведение – да, гарантирует адекватное поведение, но при этом любое допустимое без гарантии повторяемости, поэтому я намеренно решил не упоминать его в своём сообщении
Я, если честно, до сих пор путаю иногда все эти поведения, а грань между implementation-defined и unspecified так и не нащупал. Лично я вполне затачиваюсь в кодах на unspecified, потому что у меня очень контролируемое окружение: я точно знаю версии glibc, gcc, msvc toolset, и проч, с чем собирается наше ПО. Но путь рискованный, да.
А когда обновляете его, то что делаете?
Страдаем и тестируем :) Это происходит примерно раз в 3-5 лет.
int* a = nullptr; std::cout << &*a << std::endl; тоже UB?
Ну, в note же упоминалось где-то, что индирекция через нулевой указатель – UB, а то, что этот пример страшно признавать таковым... :)
Обсуждают сегодня