Как умышленно удалить boost:: shared_ptr?
У меня есть много объектов boost::shared_ptr<MyClass>
, и в какой-то момент я намеренно хочу delete
некоторых из них освободить некоторую память. (Я знаю в этот момент, что мне больше не понадобятся объекты с указателем на MyClass
.) Как я могу это сделать?
Я думаю, вы не можете просто вызвать delete()
с необработанным указателем, который я получаю с get()
.
Я видел функцию get_deleter(shared_ptr<T> const & p)
в boost::shared_ptr
, но я не уверен, как ее использовать, а также говорит, что экспериментатор находится рядом с ней. (Я думаю, что у меня есть Boost 1.38.)
Возможно, просто назначьте новую пустую boost::shared_ptr
переменной? Это должно выбросить старое значение и удалить его.
Ответы
Ответ 1
Вы просто делаете
ptr.reset();
См. руководство shared_ptr. Это эквивалентно
shared_ptr<T>().swap(ptr)
Вы вызываете reset
для каждого умного указателя, который больше не должен ссылаться на объект. Последний такой reset
(или любое другое действие, вызывающее падение отсчета ссылок на ноль) фактически приведет к тому, что объект будет свободен с использованием делетера автоматически.
Возможно, вас интересует Методы программирования Smart Pointer. В нем есть запись о отложенном освобождении.
Ответ 2
Если вы хотите умышленно удалить объекты (я делаю все это время), вы должны использовать единое владение. Вы были привлечены к использованию shared_ptr, когда это не подходит для вашего дизайна.
Ответ 3
Вся точка boost::shared_ptr<T>
заключается в том, что объект pointee будет удален точно в тот момент, когда на нем нет точки shared_ptr<T>
, т.е. когда последний shared_ptr<T>
, указывающий на этот объект, выходит из сферы действия или переназначается, чтобы указать на другой объект. Итак, все, что вам нужно сделать для удаления объекта, - это убедиться, что на нем нет shared_ptr<T>
. Например. если у вас есть только один shared_ptr<T>
, называемый p
, указывающий на объект, либо пусть он выпадет из области видимости, либо вызовет p.reset()
(эквивалентно p = NULL
для простого указателя) или назначит ему указать что-то иначе.
Если у вас есть два shared_ptr<T>
, указывающих на объект, вам нужно перераспределить их оба.
EDIT: Благодаря dehmann для указания, что p = NULL;
на самом деле не действительный код для shared_ptr<T>
...:)
Ответ 4
Что вы хотите сделать, это вернуть слабые ссылки, используя boost:: weak_ptr, которые при необходимости могут быть преобразованы в shared_ptr. Это может позволить вам контролировать время жизни объекта в shared_ptr, а те, которые хотят получить к нему доступ, могут удерживать слабые_ptr и пытаться преобразовать в shared_ptr. Если это преобразование завершится с ошибкой, они могут повторно запросить и вернуть объект обратно в память.