智能指针,当c++ 11不支持时,它不会转移所有权,也不会被共享

Smart pointer that does transfer of ownership and is not shared when C++11 is not an option

本文关键字:转移 所有权 共享 指针 c++ 智能 不支持      更新时间:2023-10-16

目前我正在解决boost::shared_ptr的问题,但语义不太正确,因为我正在将成员从一个对象"移植"到另一个对象。我浏览了一下这个列表,但并没有太多收获。我的谷歌搜索也是如此。

本质上我正在寻找一个unique_ptr实现与我的gcc4.2工作(因此限制不使用c++ 11)

您可以坚持使用std::auto_ptr,直到Boost在新的Boost Move库(c++ 03兼容)之上实现unique_ptr

查看此邮件列表流量d.d. 2011年11月10日:http://boost.2283326.n4.nabble.com/smart-ptr-Inclusion-of-unique-ptr-td4021667.html

Edit和Boost Interprocess有一个uniqe_ptr<>类模板浮动:

  • http://www.boost.org/doc/libs/1_48_0/doc/html/boost/interprocess/unique_ptr.html

根据您的实际需要,您可以考虑使用boost::scoped_ptr。它与std::unique_ptr非常相似,但它不能被移动(因为c++ 03不知道移动语义)。然而,它可以被交换。因此,当你想要转让所有权时,只需这样做:

boost::scoped_ptr<T> dummy;
dummy.swap(my_ptr);
// now you have basically transferred ownership from my_ptr to dummy

使用std::auto_ptr<</p>

llvm::OwningPtr -它有take方法来获取所有权。

boost::shared_ptr with custom deleter.

这是我在单元测试中用来模拟Corba _var类行为的东西。

struct CondDel {
  bool doDel;
  CondDel() : doDel(true) {
  }
  template<typename T>
  void operator()(T* p) {
    if (doDel)
      delete p;
  }
};
class MyCorbaObj_var : public boost::shared_ptr<_objref_MyCorbaObj> {
public:
  MyCorbaObj_var(_objref_MyCorbaObj* p) : boost::shared_ptr<_objref_MyCorbaObj>(p, CondDel()) {
  }
  _objref_MyCorbaObj* _retn() {
    CondDel* cd = (CondDel*)_internal_get_deleter(typeid(CondDel));
    cd->doDel = false;
    return get();
  }
};

如果你想复制类的对象来复制指向项,那么没有一种指针(auto_ptr, shared_ptr或裸指针)可以做你想做的事情,除非你做一些额外的工作。您需要自己管理复制。确保实现了复制构造函数和赋值操作符,以便它们克隆指向的项并将新指针存储在目标对象中。如果这样做,auto_ptr和shared_ptr都可以很好地工作。