Нет ли запас никакого-op deallocator в Повышении для использования с boost::shared_ptr
для статических объектов, и т.д.
Я знаю, что это ультратривиально для записи, но я не хочу опрыскивать свой код дополнительными крошечными функциями, если уже существует одно доступное.
Разве не было бы чище просто взять дополнительную ссылку, чтобы освободитель никогда не вызывался? (Хотя это все еще не очень чисто.)
Я не могу сказать, что в Boost нет функции, которая бы выполняла эту работу, но это не похоже на то, что они хотели бы включить.
РЕДАКТИРОВАТЬ: Прочитав комментарии и небольшую документацию, все сводится к следующему:
Утечка ссылок. В какой-то момент выполните следующее:
new shared_ptr (my_global_shared_ptr);
Преимущества: концептуально просто. Недостатки: у вас что-то в кучу подтекает.
Пользовательский деаллокатор. Поскольку shared_ptr
требует немного от функции освобождения памяти, анонимная функция идентификации, подобная той, что предоставлена в другом ответе, подойдет.
Преимущества: использует Boost и абсолютно не требует накладных расходов. Недостатки: требуется небольшая документация.
Нестатический глобальный объект. Если для вашего объекта существует глобальный shared_ptr
, это должно быть единственным средством доступа к нему. Замените объявление global на shared_ptr
, инициализированное новым my_class
. Думаю, это лучше всего.
Решение использует Boost.Lambda:
#include <boost/shared_ptr.hpp>
#include <boost/lambda/lambda.hpp>
int main()
{
int *p = new int(5);
{
boost::shared_ptr<int> sp(p, boost::lambda::_1);
}
delete p;
}
'boost :: lambda :: _ 1' создает пустой функтор, который принимает один аргумент.
Вы, вероятно, захотите добавить // комментарий, чтобы люди знали, почему вы это сделали.