Вдъхновен от този въпрос.
Да предположим, че в кода на 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
на lvalues. - person Steve Jessop   schedule 15.02.2011delete
унищожава обекта, преди да извикаoperator delete
за освобождаване на паметта. - person fredoverflow   schedule 15.02.2011