C ++: вопрос об освобождении памяти - PullRequest
1 голос
/ 05 июня 2010

На Learn C ++ они написали это для освобождения памяти:

int *pnValue = new int; // dynamically allocate an integer
*pnValue = 7; // assign 7 to this integer
delete pnValue;
pnValue = 0;

Мой вопрос: «Нужно ли последнее утверждение, чтобы освободить память правильно, полностью?»

Я думалчто указатель *pnValue все еще находится в стеке, а new не имеет никакого смысла для указателя.И если он находится в стеке, он будет очищен, когда приложение покинет область действия (в которой объявлен указатель), не так ли?

Ответы [ 2 ]

3 голосов
/ 05 июня 2010

В этом нет необходимости, но всегда полезно установить указатели на NULL (0), когда вы закончите с ними.Таким образом, если вы передадите его функции (что будет ошибкой), она, скорее всего, выдаст вам ошибку, а не попытается работать с недействительной памятью (значительно упростит поиск ошибки)И это также упрощает условия.

2 голосов
/ 05 июня 2010

Установка указателя на NULL (или ноль) после удаления не обязательна.Однако это хорошая практика.Во-первых, вы не сможете получить доступ к некоторым случайным данным, если впоследствии разыменуете указатель.Кроме того, вы часто будете находить код со следующим:

if(ptr)
{
  delete ptr;
  ptr = NULL;
}

Таким образом, установка указателя на NULL гарантирует, что он не будет удален дважды.

Наконец, вы можете найти код, подобныйэто:

void foo(bar *ptr)
{
  if(!ptr) throw Exception(); // or return, or do some other error checking
  // ...
}

И вы, вероятно, хотели бы, чтобы эта проверка безопасности была пройдена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...