0

Эквивалент unique_ptr в Boost?

9

Проблема: Есть ли эквивалент класса std::unique_ptr из C++11 в библиотеке Boost?

Я ищу поведение, позволяющее создать безопасную для исключений фабричную функцию, вот так:

std::unique_ptr<Base> create_base()
{
    return std::unique_ptr<Base>(new Derived);
}

void some_other_function()
{
    std::unique_ptr<Base> b = create_base();

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

    // Теперь b уничтожается автоматически.
}

Редактирование: В данный момент я использую такой «хаки»:

Base* create_base()
{
    return new Derived;
}

void some_other_function()
{
    boost::scoped_ptr<Base> b = create_base();

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

    // Теперь b автоматически удаляется.
}

Но я хотел бы знать, есть ли более подходящее решение для безопасного управления памятью при использовании Boost?

2 ответ(ов)

0

Создать что-то подобное unique_ptr без C++0x невозможно (где он стал частью стандартной библиотеки, и поэтому Boost больше не нужно его предоставлять).

В частности, без rvalue-ссылок, которые являются особенностью C++0x, надежная реализация unique_ptr невозможна, независимо от того, используете ли вы Boost или нет.

В C++03 существуют несколько возможных альтернатив, хотя у каждой из них есть свои недостатки.

  • boost::shared_ptr — вероятно, самый простой заменитель с точки зрения возможностей. Вы можете безопасно использовать его везде, где вы бы использовали unique_ptr, и это будет работать. Просто такая замена будет менее эффективной из-за добавления подсчета ссылок. Но если вам нужен простой аналог, который сможет справиться со всем, что может unique_ptr, это, вероятно, ваш лучший выбор. (Конечно, shared_ptr может делать намного больше, но его можно также использовать как замену для unique_ptr).
  • boost::scoped_ptr похож на unique_ptr, но не позволяет передавать владение. Он работает отлично, пока умный указатель предназначен для сохранения исключительного владения на протяжении всей своей жизни.
  • std::auto_ptr работает очень похоже на unique_ptr, но имеет несколько ограничений, главным образом он не может храниться в контейнерах стандартной библиотеки. Если вам нужен указатель, который позволяет передавать владение, но не предназначен для хранения в контейнерах или копирования, это хороший вариант.
0

Вы можете рассмотреть реализацию unique_ptr<> от Ховарда Хиннента в качестве 'доказательства концепции' для C++03 (предупреждение - я сам не пробовал):

Один из его примеров показывает, как возвращать unique_ptr<int>:

unique_ptr<int> factory(int i)
{
    return unique_ptr<int>(new int(i));
}

Этот пример демонстрирует, как создать и вернуть unique_ptr, управляющий динамически выделенной памятью для целого числа.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь