Что лучше: удалить указатель или установить его с новым значением? - PullRequest
2 голосов
/ 31 мая 2010

простой вопрос на с ++, скажем, у меня есть цикл, и у меня есть функция, которая возвращает указатель на элемент
поэтому я должен определить указатель внутреннего цикла, поэтому мой вопрос, что делать с указателем внутри цикла, удалить его? или установить его с новым значением хорошо
например:

for(int i =0;i<count();i++)
{

 ptrTmp* ptr = getItemPtr();
 // do somthing with the ptr ...
 // what to do here ? to delete the poinetr or not? 
 delete ptr;  // ??

}

Ответы [ 3 ]

11 голосов
/ 31 мая 2010

Это полностью зависит от того, что указывает интерфейс getItemPtr. Обычно интерфейс «получить указатель», который возвращает необработанный указатель, не передает права владения указанным объектом, поэтому было бы ошибкой удалить его. В этом случае вы можете спокойно позволить переменной указателя выйти из области видимости. Нет необходимости устанавливать его на NULL.

С другой стороны, getItemPtr может быть задокументировано как возвращающий указатель на новый объект, который должен быть удален, в этом случае вам нужно будет удалить его, но лучший способ убедиться в этом - использование умного указателя чтобы убедиться, что это произойдет. В вашем примере инициализация std::auto_ptr была бы самым простым и наиболее переносимым способом сделать это.

std::auto_ptr<ptrTmp> ptr( getItemPtr() );
4 голосов
/ 31 мая 2010

Зависит от того, что делает getItemPtr().

Что говорит документация?

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

Обычно, когда функция возвращает указатель и говорит, что вы ответственны за его удаление, существует противоположная функция (что-то вроде deletePointer(PointedType* pointer)), роль которой состоит в удалении выделенной памяти. Поскольку, если не указано иное, вы не можете предполагать, что указанное значение было выделено с помощью new, и, следовательно, не можете точно знать, должны ли вы вызывать delete, delete[] или free().

Вы можете также установить указатель на NULL после его удаления, чтобы избежать повторного использования в будущем; это хорошая практика.

1 голос
/ 31 мая 2010

Запись delete ptr;, фактически уничтожает pointee . Если вы не хотите его уничтожать, просто оставьте указатель выходящим из области видимости.

Установка указателя на новое значение не повлияет на pointee .

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