Почему указатель на одно целое место в памяти не может быть удален? - PullRequest
0 голосов
/ 02 января 2012
#include <iostream>
using namespace std;

int main ()
{
    int myarray [10];
    int * ptr1;
    ptr1 = new (nothrow) int [10];
    cout << "ptr1 = " << ptr1 << endl;
    delete [] ptr1;
    cout << "ptr1 = " << ptr1 << endl;

    int a = 4;
    int * ptr2;
    ptr2 = &a;
    cout << "ptr2 = " << ptr2 << endl;
    delete ptr2;
    cout << "ptr2 = " << ptr2 << endl;



    return 0;
}

Он выводит

ptr1 = 0x9941008
ptr1 = 0x9941008
ptr2 = 0xbfca5cd4

Вопросы:

1) Почему второй отпечаток ptr1 все еще возвращает то же значение?Память освобождается, но указатель сохраняет значение адреса памяти?

2) Почему не выводится второй отпечаток ptr2?

Ответы [ 3 ]

5 голосов
/ 02 января 2012
  • delete освобождает память, но не меняет значение указателя.Однако обратите внимание, что указатель теперь указывает на освобожденную область памяти, поэтому вы не должны использовать его до тех пор, пока не сбросите его.
  • Ваша программа наверняка аварийно завершает работу перед второй печатью, поскольку вы пытаетесь освободить указатель,не было выделено в куче.Вы можете использовать только delete областей памяти, которые ранее были выделены в куче с помощью оператора new.
2 голосов
/ 02 января 2012

1) Потому что указатель все равно будет указывать на то же место.Вы печатаете там, где он указывает , а не , на что он указывает .Это описание того, где программа должна что-то найти.Если вы пометите флажок, а затем удалите его содержимое, ярлык (указатель) все еще будет там.

2) Нельзя удалить то, что было выделено в стеке .

1 голос
/ 02 января 2012

Удаление указателя не меняет значение указателя.По сути, он имеет два эффекта:

  1. уничтожает указанный объект.Очевидно, что уничтожение int не имеет никакого эффекта
  2. , оно объявляет, что указанная память теперь не используется в системе памяти

Если вы хотите наблюдать за удалением intpointer, вам необходимо заменитьфункции globel operator new () и operator delete () (что может быть интересным экспериментом, но обычно ничего не нужно делать в рабочем коде).

...