unique_ptr相当于boost吗?

在boost库中有一些C ++ 1x的std :: unique_ptr的等价类吗? 我正在寻找的行为是能够有一个exception安全的工厂function,像这样…

std::unique_ptr<Base> create_base() { return std::unique_ptr<Base>(new Derived); } void some_other_function() { std::unique_ptr<Base> b = create_base(); // Do some stuff with b that may or may not throw an exception... // Now b is destructed automagically. } 

编辑:现在,我正在使用这个黑客,这似乎是最好的,我可以在这一点上…

 Base* create_base() { return new Derived; } void some_other_function() { boost::scoped_ptr<Base> b = create_base(); // Do some stuff with b that may or may not throw an exception... // Now b is deleted automagically. } 

如果没有C ++ 0x(它是标准库的一部分,所以Boost不需要提供它),就不可能创build类似unique_ptr东西。

特别是没有右值引用(这是C ++ 0x中的一个特性),无论是否使用Boost, unique_ptr的强大实现都是不可能的。

在C ++ 03中,有一些可能的select,尽pipe每个都有缺陷。

  • boost::shared_ptr可能是Capabilites方面最简单的替代品。 你可以放心地使用它,否则使用unique_ptr ,它会工作。 由于增加了引用计数,它不会那么高效。 但是,如果你正在寻找一个简单的替代品,能够处理unique_ptr可以做的所有事情,那么这可能是你最好的select。 (当然, shared_ptr也可以做更多的事情,但是它也可以简单地用作unique_ptrreplace)。
  • boost::scoped_ptr类似于unique_ptr但不允许所有权转移。 只要智能指针在整个生命周期中保持独占所有权,它就可以工作。
  • std::auto_ptrunique_ptr非常相似,但有一些限制,主要是它不能存储在标准库容器中。 如果您只是在寻找一个允许转让所有权的指针,但是这并不意味着存储在容器中或者被复制,这可能是一个很好的select。

从Boost 1.57开始,在Boost.Move库中有一个官方的unique_ptr实现。

从文档 :

(…)替代std :: unique_ptr,也可以从C ++ 03编译器中使用。

代码可以在<boost/move/unique_ptr.hpp>头文件中find,并且位于boost::movelib名称空间中。 此外,Boost.Move库在boost::movelib <boost/move/make_unique.hpp>也提供了make_unique()工厂函数,同样也在boost::movelib命名空间中。

因此,这个问题的例子可以这样实现:

 #include <boost/move/unique_ptr.hpp> using boost::movelib::unique_ptr; unique_ptr<Base> create_base() { return unique_ptr<Base>(new Derived); } 

在Wandbox上查看一个实例 。 请注意,代码在C ++ 98模式(!)下使用gcc 4.6.4编译得很好。

boost::movelib::unique_ptr在基类/派生类中应用于您的情况时有什么意思,该实现提供了对基类中的虚析构函数声明的编译时检查。 如果碰巧忽略它,代码将不会编译 (单击“运行(…)”button以查看编译器错误消息)。

一个小问题是,包括来自boost/move目录,但代码居住在boost::movelib命名空间(微妙的差异,但可能是烦人的)。

有关更多详细信息,另请参阅boost邮件列表上的线程 。

感谢IonGaztañaga为这个绝对独特和有用的代码。

你可能想尝试一下Howard Hinnant的“validation概念” unique_ptr<>实现C ++ 03(声明 – 我没有):

他的一个例子是返回一个unique_ptr<int>

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

如何从进程间库unique_ptr

我已经使用霍华德Hinnant的unique_ptr 。 如果你不擅长从你的编译器中读取疯狂的元编程错误,你可能需要清理一下。 但是,在90%的情况下,它的行为就像一个unique_ptr。

否则,我会build议传递参数作为boost::scoped_ptr&和内部交换来窃取所有权。 要获得unique_ptr样式的返回值,使用auto_ptr 。 捕获shared_ptrscoped_ptrauto_ptr返回值,以避免直接使用auto_ptr