Подтвердить что ты не робот

Как умышленно удалить 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 переменной? Это должно выбросить старое значение и удалить его.

4b9b3361

Ответ 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. Если это преобразование завершится с ошибкой, они могут повторно запросить и вернуть объект обратно в память.