在C ++中传递对象所有权

时间:2009-01-13 09:30:30

标签: c++

指示某个对象想要取得另一个对象的所有权的最佳方法是什么?到目前为止,我一直在公共接口中使用std::auto_ptr,因此客户端知道接口想要获取传递对象的所有权。

然而,最新的GCC告诉我auto_ptr已被弃用,所以我想知道推荐什么? boost::interprocess::unique_pointer看起来是一个很好的候选人,但这真的是最好的解决方案吗?

5 个答案:

答案 0 :(得分:9)

boost::interprocess是一个用于进程间通信的库,所以我不会将它用于不同的目的。

正如本论坛所讨论的那样:

http://objectmix.com/c/113487-std-auto_ptr-deprecated.html

std::auto_ptr将在标准的下一个版本中被声明为不推荐使用,建议使用std::unique_ptr,这需要实现rvalue引用和移动语义(这是一个相当复杂的功能) )。

在新标准发布之前,我会尽可能地尝试禁用警告,或者忽略它,以获得最大的可移植性。

如果您想要切换到下一个语言标准,则可以实现右值引用(请参阅http://russ.yanofsky.org/rref/),因此也应支持std::unique_ptr

关于新语义的优点是你可以将移动构造函数也传递给临时或任何右值;在其他情况下,这允许在销毁原始对象之前避免复制(例如)std::vector内包含的对象(在重新分配期间)。

答案 1 :(得分:3)

std::unique_ptr确实是新推荐的方式。使用C ++ 0x容器将变为移动感知,这意味着它们可以处理可正确移动的类型(即,std::vector<std::auto_ptr<x> >不起作用,但std::vector<std::unique_ptr<x>>将会起作用。

对于boostboost::interprocess个容器已经支持可移动类型,其中boost::interprocess::unique_ptr就是其中之一。它们类似于前C ++ 0x中的可移动类型,通过使用一些“普通”boost-template魔法,并在支持它们的地方使用r值引用。

我不知道auto_ptr专用弃用,但我没有密切关注新的标准演变。

编辑boost::interprocess::unique_ptr的实施确实不是{公1“智能指针,如boost::shared_ptrboost::scoped_ptr,但它是(请参阅{ {3}})不仅可以用于共享内存,还可以用于通用目的。

但是,我很确定如果GCC弃用auto_ptr模板,他们已经提供了自己的unique_ptr实现(如果你还没有可行的替代方案,那么弃用的用处不多)。< / p>

然而,尽管如此,如果您正在使用C ++ 0x平台,请使用编译器lib提供的unique_ptr,如果没有,请坚持使用auto_ptr

答案 2 :(得分:2)

我同意你应该尽可能使用编译器协助所有权转移的类型。

如果你没有那种数据类型选择并且正在传递原始指针,我遵循Taligent编程指导方针,命名方法将所有权放弃为 orphanBlah ,以及将所有权归为的参数adoptBlah

答案 3 :(得分:0)

std :: auto_ptr实现了复制和赋值的所有权传递,所以你不应该对此做任何特别的事情:

std::auto_ptr< T > p = somePtr; // not p owns object, referenced by somePtr
std::auto_ptr< T > q = myObj.GetAutoPtr(); // not q owns object referenced by auto_ptr in myObj

但是传递对象所有权并不是一个好的设计实践,它会导致泄漏和对象生命周期相对错误。

答案 4 :(得分:0)

我不记得std :: auto_ptr被弃用了 任何人都有相关标准会议的链接,他们会讨论这个问题吗?

快速谷歌发现了这个: http://objectmix.com/c/113487-std-auto_ptr-deprecated.html

>> In fact the latest publicly available draft lists auto_ptr in appendix
>> D, meaning that there is clear intent to formally deprecate it in the
>> next revision of C++. A new class named unique_ptr is going to provide
>> a replacement for auto_ptr, the main difference being that unique_ptr
>> uses rvalue-references instead of voodoo magic to properly achieve
>> move semantic.
>
> Is a reference implementation available? Is it too early to start using it?
>

In order to use unique_ptr you need first to have a compiler which
properly supports rvalue references. These can be hard to find nowadays,
as the feature has not yet been standardized, although the situation is
quickly improving. For example GCC has very recently added the feature
in v4.3 (http://gcc.gnu.org/gcc-4.3/cxx0x_status.html). If you are lucky
enough to have one of those compilers, most probably they already ship a
version of unique_ptr (it's a sort of benchmark for the feature, you
know). In any case, you can find reference implementations on the
internet by just googling unique_ptr.

所以看起来他们不得不弃用auto_ptr而转而使用unique_ptr(它具有相同的语义)。但它需要一个支持即将推出的C ++版本中提议的新功能的编译器。

但是还有另一次会议,因此投票到来,所以事情可能会在标准具体化之前发生变化。