Эквивалент unique_ptr в Boost?
Проблема: Есть ли эквивалент класса 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 ответ(ов)
Создать что-то подобное 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
, но имеет несколько ограничений, главным образом он не может храниться в контейнерах стандартной библиотеки. Если вам нужен указатель, который позволяет передавать владение, но не предназначен для хранения в контейнерах или копирования, это хороший вариант.
Вы можете рассмотреть реализацию unique_ptr<>
от Ховарда Хиннента в качестве 'доказательства концепции' для C++03 (предупреждение - я сам не пробовал):
Один из его примеров показывает, как возвращать unique_ptr<int>
:
unique_ptr<int> factory(int i)
{
return unique_ptr<int>(new int(i));
}
Этот пример демонстрирует, как создать и вернуть unique_ptr
, управляющий динамически выделенной памятью для целого числа.
Когда действительно стоит использовать noexcept?
Возможно ли вывести тип переменной в стандартном C++?
Почему `std::initializer_list` не поддерживает оператор подиндексации?
Можно ли вручную определить преобразование для класса enum?
Стоит ли игнорировать предупреждение "-Wmissing-braces" от gcc/clang?