目前我正在解决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都可以很好地工作。