现在shared_ptr
是在tr1中,您认为应该如何使用std::auto_ptr
?它们都有不同的用例,但所有用例auto_ptr
都可以解决shared_ptr
.auto_ptr
如果您想明确表达只有一个类在任何给定点拥有所有权,您会放弃或继续使用它吗?
我的看法是使用auto_ptr
可以增加代码的清晰度,正是通过添加细微差别和代码设计的指示,但另一方面,它在培训新程序员时又增加了另一个微妙的问题:他们需要理解智能指针和他们如何工作的细节.当你在任何地方只使用一个智能指针时,你可以放下一个规则"将所有指针包裹起来shared_ptr
"并完成它.
你对此有何看法?
auto_ptr在签名方面也很不错.当一个函数取一个auto_ptr
by值时,就意味着它会消耗T
.如果一个函数返回一个auto_ptr
,很明显它放弃了所有权.这可以传达您对生命的意图.
另一方面,使用scoped_ptr
暗示你不想关心的生命周期T
.这也意味着您可以在更多地方使用它.两个智能指针都是有效的选择,你当然可以在一个程序中同时使用.
为'避免std::auto_ptr
'阵营提供更多弹药: auto_ptr
在下一个标准(C++ 0x)中被弃用.我认为仅凭这一点就足以让任何争论使用别的东西了.
但是,正如Konrad Rudolph所提到的那样,默认替换auto_ptr
应该是boost::scoped_ptr
.语义scoped_ptr
更接近匹配,auto_ptr
并且用于类似用途.下一个C++ 09标准将有类似的名为unique_ptr.
但是,使用shared_ptr
任何scoped_ptr
应该使用的地方都不会破坏任何东西,如果对象永远不会被共享,那么它只会添加一点点低效率来处理引用计数.因此对于永远不会分发给另一个对象的私有成员指针 - 使用scoped_ptr
.如果指针将被分发给其他东西(这包括在容器中使用它们,或者如果您想要做的只是转移所有权而不是保留或共享它) - 请使用shared_ptr
.
" shared_ptr
随处使用"是一个很好的默认规则,当然也是教人们负责任地使用智能指针的良好起点.然而,它并不总是最好的选择.
如果您不需要共享所有权,shared_ptr
那就太过分了:它必须为引用计数分配一个单独的内存块,这会影响性能,而且文档方面也不太明确.
就个人而言,我std::auto_ptr
在许多地方使用boost::scoped_ptr
也足够了:例如,在所有权转移到其他地方之前持有堆分配的对象,干预操作可能会抛出.
C++ 0x必须作为更好的替代品来std::unique_ptr
补充.当它变得广泛可用时,我将开始使用它.std::shared_ptr
std::auto_ptr
我认为这是最好的做法是替代的所有用途std::auto_ptr
的boost::scoped_ptr
,除非std::tr1::shared_ptr
符合要求更好,如果你不介意使用升压.另一方面,它肯定是故意的,scoped_ptr
不包括在TR1中.