2010-01-16 2 views
1

Так что же происходит с указателем, если вы освобождаете объект, принадлежащий auto_ptr, но на самом деле не назначаете его необработанному указателю? Похоже, он должен быть удален, но у него никогда не будет возможности. Так ли это просочилось «в дикую природу»?auto_ptr освобожден без присвоения его возвращаемого значения

void usingPointer(int* p); 

std::auto_ptr<int> point(new int); 
*point = 3; 

usingPointer(point.release()); 

Примечание: я больше не использую auto_ptr, теперь я использую tr1 :: shared_ptr. Эта ситуация мне только показалась любопытной.

+0

Изменить * «Так ли оно просочилось« в дикую природу »?» * * * Так оно и получится ** выпущено ** «в дикую природу»? »*, И вы получите свой ответ, и вдохновение за именем. :) Да, 'release''ing освобождает' auto_ptr' всех управленческих обязанностей. – GManNickG

+0

'usingPointer' * может * удалить его в этом примере. Однако, если вам нужен простой указатель, позволяя интеллектуальному указателю управлять объектом, вы должны использовать 'point.get()' (также с 'shared_ptr') – UncleBens

ответ

2

release не предполагают, чтобы удалить принадлежащую точку, из документации:

Устанавливает auto_ptr внутренний указатель на нулевой указатель (который указывает, что не указывает ни на объект) без разрушающие объект в настоящее время указал с помощью auto_ptr.

Кроме того, это излишество, чтобы заменить все виды использования вашего auto_ptr с tr1::shared_ptr - вы должны использовать unique_ptr, где общий один не является необходимым.

+0

Я в основном заменил его, когда понял, что auto_ptr не применяет const copy, и мне понадобится указатель для копирования и использования среди разных экземпляров класса. –

3

Если usingPointer вызывает delete по адресу p, это утечка памяти. Если вы назовете get вместо release, тогда память будет автоматически удалена, когда point выпадет из сферы действия.

Смежные вопросы