Удаление указателя - PullRequest
       2

Удаление указателя

0 голосов
/ 02 октября 2011

В C ++, каков рекомендуемый способ удаления указателя? Например, в следующем случае мне нужны все три строки, чтобы безопасно удалить указатель (и если да, что они делают)?

// Create
MyClass* myObject;
myObject = new MyClass(myVarA, myVarB, myVarC);

// Use
// ...

// Delete
if(myObject) { 
    delete myObject; 
    myObject = NULL; 
}

Ответы [ 4 ]

6 голосов
/ 02 октября 2011

Нет, вам не нужно проверять NULL.
delete заботится, если передается указатель NULL.

delete myObject; 
myObject = NULL; 

достаточно.

В качестве общей политики избегайте использования свободных хранилищ везде, где можете, и если вам необходимо использовать Умные указатели ( RAII ) вместо необработанных указателей.


C ++ 03 Стандартный раздел § 3.7.3.2.3:

Значение первого аргумента, предоставленного одной из функций освобождения, предоставляемых в стандартной библиотеке, может быть значением нулевого указателя; если это так, вызов функции освобождения не имеет никакого эффекта . В противном случае значение, предоставленное оператору delete (void *) в стандартной библиотеке, должно быть одним из значений, возвращаемых предыдущим вызовом либо оператора new (size_t), либо оператора new (size_t, const std :: nothrow_t &) в стандартной библиотеке и значение, предоставленное оператору delete в стандартной библиотеке, должно быть одним из значений, возвращаемых предыдущим вызовом оператора new или оператора new [] (size_t, const std :: nothrow_t &) в стандартной библиотеке.

4 голосов
/ 02 октября 2011

Нет, вам это не нужно.

Просто напишите delete p и убедитесь, что вы не принимаете советов ни от кого другого, отстаивающего, что вы делаете больше.

Общие советы: избегать необработанных new и delete.Позвольте некоторому стандартному контейнеру иметь дело с размещением, копированием и освобождением.Или используйте смарт-указатель.

Cheers & hth.,

3 голосов
/ 02 октября 2011

Лучше всего использовать класс управления ресурсами и позволить библиотеке позаботиться об этом за вас:

#include <memory>


void foo()  // unique pointer
{
  std::unique_ptr<MyClass> myObject(new Myclass(myVarA, myVarB, myVarC));
  // ...
}  // all clean

void goo()  // shared pointer -- feel free to pass it around
{
  auto myObject = std::make_shared<MyClass>(myVarA, myVarB, myVarC);
  // ...
}  // all clean

void hoo()  // manual -- you better know what you're doing!
{
  MyClass * myObject = new MyClass(myVarA, myVarB, myVarC);
  // ...
  delete myObject;  // hope there wasn't an exception!
}
2 голосов
/ 02 октября 2011

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

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