На основе этого вопроса.
Предположим, что в коде C ++ у меня есть действительный указатель и правильно delete
. Согласно стандарту C ++ указатель станет недействительным (3.7.3.2/4 - функция освобождения сделает недействительными все указатели, относящиеся ко всем частям освобожденного хранилища).
По крайней мере, в большинстве реализаций он сохраняет значение и будет хранить тот же адрес, что и до delete
, однако использование значения является неопределенным поведением.
Гарантирует ли стандарт, что указатель сохранит свое значение, или значение может изменяться?
delete
получить доступ к указателю, то есть к чему-либо, кроме передачи по значению? - person Rup   schedule 15.02.2011printf()
его) послеdelete
равно UB, поэтому пользователь не может даже юридически прочитать указатель и сравнить его с исходным значением. - person sharptooth   schedule 15.02.2011delete
указатель, и после этого он сохраняет0xDEADBEEF
адрес. - person sharptooth   schedule 15.02.2011operator delete
) для делегирования своей работы. И что у ключевого слова нет «подписи». - person Lightness Races in Orbit   schedule 15.02.2011delete
. - person sharptooth   schedule 15.02.2011operator delete
и kin.) - person GManNickG   schedule 15.02.2011memcmp()
его со значением послеdelete
, не будет ли это неопределенное поведение? - person sharptooth   schedule 15.02.2011memcmp
не использует значение указателя, насколько я читал стандарт. Это не неопределенное поведение дляmemcmp
4 байтов, которые оказались недействительными в качестве значения с плавающей запятой, так почему же оно должно быть неопределенным дляmemcmp
4 байтов, которые просто так оказались недопустимыми в качестве значения указателя? Память всегда можно рассматривать как байты, при условии, что она все еще выделена, не имеет значения, что она представляет или не представляет. Только не используйте значение указателя. Результатmemcmp
может быть неопределенным или определяемым реализацией, в зависимости от того, что стандарт говорит оdelete
для lvalue. - person Steve Jessop   schedule 15.02.2011delete
уничтожает объект перед вызовомoperator delete
для освобождения памяти. - person fredoverflow   schedule 15.02.2011