既然shared_ptr
在tr1中,您认为使用std::auto_ptr
会怎样?它们都有不同的用例,但auto_ptr
的所有用例也可以通过shared_ptr
来解决。如果您想明确表示只有一个类在任何给定点拥有所有权,您会放弃auto_ptr
还是继续使用它?
我的看法是,使用auto_ptr
可以增加代码的清晰度,正是通过添加细微差别和代码设计的指示,但另一方面,它在培训新程序员时又增加了另一个微妙的问题:他们需要了解智能指针以及它们如何工作的细节。当你在任何地方只使用一个智能指针时,你可以放下一个规则'在shared_ptr
'中包装所有指针并完成它。
你对此有何看法?
答案 0 :(得分:28)
auto_ptr在签名方面也很不错。当函数按值auto_ptr<T>
时,表示它将使用T
。如果函数返回auto_ptr<T>
,则很明显它放弃了所有权。这可以传达你对生命的意图。
另一方面,使用scoped_ptr<T>
意味着您不想关心T
的生命周期。这也意味着您可以在更多地方使用它。两个智能指针都是有效的选择,你当然可以在一个程序中同时使用。
答案 1 :(得分:13)
为'avoid 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
。
答案 2 :(得分:11)
“在任何地方使用shared_ptr
”是一个很好的默认规则,当然也是教人们负责任地使用智能指针的一个很好的起点。但是,它并不总是最佳选择。
如果您不需要共享所有权,shared_ptr
是过度的:它必须为引用计数分配一个单独的内存块,这可能会影响性能,而且在文档方面不太明确。
就个人而言,我在许多std::auto_ptr
也足够的地方使用boost::scoped_ptr
:在所有权转移到其他地方之前持有堆分配的对象,其中干预操作可能会抛出。
C ++ 0x将std::unique_ptr
补充std::shared_ptr
作为std::auto_ptr
的更好替代方案。当它变得广泛可用时,我将开始使用它。
答案 3 :(得分:5)
我认为最好的做法是将std::auto_ptr
的所有用法替换为boost::scoped_ptr
,除非std::tr1::shared_ptr
更好地满足要求,如果你没有介意使用Boost。另一方面,TR1确实没有包含scoped_ptr
。
答案 4 :(得分:3)
我相信“在shared_ptr
中包装所有指针”确实应该是默认模式,并且是适合给你的初级程序员的建议。但是,在您提到的特殊所有权案例中,auto_ptr
确实更合适,在这种情况下应该鼓励使用它。