Вопрос

У меня много boost::shared_ptr<MyClass> объектов, и в какой-то момент я намеренно хочу delete освободить часть памяти для некоторых из них. (В этот момент я знаю, что мне больше не понадобятся объекты с указанием на MyClass.) Как я могу это сделать?

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

Я видел функцию get_deleter(shared_ptr<T> const & p) в boost::shared_ptr, но я не уверен, как ее использовать, а также рядом с ней написано экспериментальная . (Я думаю, что у меня есть Boost 1,38.)

Может быть, просто присвоить новую пустую <=> переменной? Это должно выбросить старое значение и удалить его.

Это было полезно?

Решение

Вы просто делаете

ptr.reset();

См. shared_ptr руководство . Это эквивалентно

shared_ptr<T>().swap(ptr)

Вы вызываете reset для каждого интеллектуального указателя, который больше не должен ссылаться на объект. Последнее такое <=> (или любое другое действие, которое фактически приводит к падению счетчика ссылок до нуля) приведет к автоматическому освобождению объекта с использованием средства удаления.

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

Другие советы

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

Суть boost::shared_ptr<T> в том, что объект-указатель будет удален точно в тот момент, когда на него не указывает shared_ptr<T> - то есть когда последний p указывает этот объект выходит из области видимости или переназначается, чтобы указать на другой объект. Итак, все, что вам нужно сделать, чтобы удалить объект, это убедиться, что на него нет указателей p.reset(). Например. если у вас есть только один p = NULL с именем p = NULL;, указывающий на объект, либо позвольте ему выпасть из области видимости, либо вызовите <=> (эквивалентно <=> для простого указателя), либо назначьте его для указания на что-то иначе.

Если у вас есть два <=> указателя на объект, вам нужно переназначить их обоих.

РЕДАКТИРОВАТЬ . Спасибо Дехманну за то, что он указал, что <=> на самом деле не является допустимым кодом для <=> ...:)

Что вы хотите сделать, так это вернуть слабые ссылки с помощью boost :: weak_ptr , который может быть преобразован в shared_ptr при необходимости. Это может позволить вам контролировать время жизни объекта в shared_ptr, а те, кто хочет получить к нему доступ, могут удерживать weak_ptr и пытаться преобразовать в shared_ptr. Если это преобразование завершится неудачно, они могут повторно запросить и вернуть объект в память.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top