Что происходит с адресом после применения к нему оператора удаления в C ++? - PullRequest
6 голосов
/ 14 февраля 2011

Если я delete указатель, например, следующим образом:

delete myPointer;

И после этого не присвоил указателю 0 следующим образом:

myPointer = 0; //skipped this

Будет ли myPointer указывать на другой адрес памяти?

Ответы [ 4 ]

18 голосов
/ 14 февраля 2011

Нет, в большинстве реализаций он будет хранить тот же адрес, что и раньше - delete обычно не меняет адрес, и если вы не назначите новое значение адреса, он останется неизменным.Однако это не всегда гарантируется .

Не забывайте, что делает что-либо, кроме присвоения нулевого указателя или другого действительного указателя уже delete d указателюповедение не определено - ваша программа может аварийно завершить работу или вести себя иначе.

5 голосов
/ 14 февраля 2011

myPointer будет указывать на тот же адрес памяти. Но для вас было бы недопустимо использовать память по этому адресу, потому что удаление вернуло бы ее обратно в среду выполнения / операционную систему, и операционная система могла бы выделить эту память для использования другим способом.

3 голосов
/ 14 февраля 2011

Определенно, нет.Операция delete не изменяет сам указатель - она ​​освобождает память, адресуемую этим указателем.

0 голосов
/ 28 июля 2018

Этот вопрос важен!Я видел, что Visual Studio 2017 изменил значение указателя после «удаления».Это вызвало проблему, потому что я использовал инструмент трассировки памяти.Инструмент собирал указатели после каждого оператора «new» и проверял их после «delete».Псевдокод:

Data* New(const size_t count)
{
    Data* const ptr(new Data[count]);
    #ifdef TEST_MODE
    MemoryDebug.CollectPointer(ptr);
    #endif
    return ptr;
}

void Delete(Data* const ptr)
{
    delete[] ptr;
    #ifdef TEST_MODE
    MemoryDebug.CheckPointer(ptr);
    #endif
}

Этот код хорошо работает в Visual Studio 2008, но не работает в Visual Studio 2017, поэтому я изменил порядок операций во второй функции.

Однако вопрос хороши проблема существует.Об этом должны знать опытные инженеры.

...