Никакой-op deallocator для повышения:: shared_ptr

Нет ли запас никакого-op deallocator в Повышении для использования с boost::shared_ptr для статических объектов, и т.д.

Я знаю, что это ультратривиально для записи, но я не хочу опрыскивать свой код дополнительными крошечными функциями, если уже существует одно доступное.

17
задан Alex B 26 April 2010 в 02:17
поделиться

2 ответа

Разве не было бы чище просто взять дополнительную ссылку, чтобы освободитель никогда не вызывался? (Хотя это все еще не очень чисто.)

Я не могу сказать, что в Boost нет функции, которая бы выполняла эту работу, но это не похоже на то, что они хотели бы включить.

РЕДАКТИРОВАТЬ: Прочитав комментарии и небольшую документацию, все сводится к следующему:

  1. Утечка ссылок. В какой-то момент выполните следующее:

     new shared_ptr (my_global_shared_ptr); 
     

    Преимущества: концептуально просто. Недостатки: у вас что-то в кучу подтекает.

  2. Пользовательский деаллокатор. Поскольку shared_ptr требует немного от функции освобождения памяти, анонимная функция идентификации, подобная той, что предоставлена ​​в другом ответе, подойдет.

    Преимущества: использует Boost и абсолютно не требует накладных расходов. Недостатки: требуется небольшая документация.

  3. Нестатический глобальный объект. Если для вашего объекта существует глобальный shared_ptr , это должно быть единственным средством доступа к нему. Замените объявление global на shared_ptr , инициализированное новым my_class . Думаю, это лучше всего.

1
ответ дан 30 November 2019 в 14:17
поделиться

Решение использует 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' создает пустой функтор, который принимает один аргумент.

Вы, вероятно, захотите добавить // комментарий, чтобы люди знали, почему вы это сделали.

3
ответ дан 30 November 2019 в 14:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: