19

现在shared_ptr在 tr1 中,您认为使用 应该发生std::auto_ptr什么?它们都有不同的用例,但auto_ptr也可以用 解决所有用例shared_ptrauto_ptr如果您想明确表示在任何给定点上只有一个类拥有所有权,您会放弃还是继续使用它?

我的看法是,使用auto_ptr可以增加代码的清晰度,正是通过增加细微差别和代码设计的指示,但另一方面,它在培训新程序员时增加了另一个微妙的问题:他们需要理解智能指针和它们如何工作的详细信息。当您在任何地方只使用一个智能指针时,您只需制定一条规则“将所有指针包装在shared_ptr”中并完成它。

你对此有何看法?

4

5 回答 5

28

auto_ptr 在签名方面也很好。当一个函数接受一个auto_ptr<T>值时,这意味着它将消耗T. 如果一个函数返回一个auto_ptr<T>,很明显它放弃了所有权。这可以传达您关于生命周期的意图。

另一方面, usingscoped_ptr<T>意味着您不想关心T. 这也意味着您可以在更多地方使用它。两个智能指针都是有效的选择,你当然可以在一个程序中同时拥有它们。

于 2008-10-13T09:34:03.223 回答
13

std::auto_ptr为“避免”阵营 提供更多弹药:auto_ptr在下一个标准(C++0x)中被弃用。我认为仅此一项就足以让任何论点使用其他东西。

但是,正如Konrad Rudolph所提到的,默认替换auto_ptr可能应该是boost::scoped_ptr. 的语义与 的语义scoped_ptr更接近,auto_ptr并且旨在用于类似的用途。下一个 C++09 标准将有类似的东西,称为 unique_ptr。

However, using shared_ptr anywhere that scoped_ptr should be used will not break anything, it'll just add a very slight bit of inefficiency to deal with the reference count if the object is never actually going to be shared. So for private member pointers that will never be handed out to another object - use scoped_ptr. If the pointer will be handed out to something else (this includes using them in containers or if all you want to do is transfer ownership and not keep or share it) - use shared_ptr.

于 2008-10-13T15:52:00.837 回答
11

shared_ptr到处使用”是一个很好的默认规则,当然也是教人们负责任地使用智能指针的一个很好的起点。然而,它并不总是最好的选择。

如果您不需要共享所有权,shared_ptr那就大材小用了:它必须为引用计数分配一个单独的内存块,这会影响性能,而且在文档方面不太清楚。

就个人而言,我std::auto_ptr在许多地方使用boost::scoped_ptr也足够了:例如,在所有权转移到其他地方之前持有一个堆分配的对象,干预操作可能会抛出。

C++0xstd::unique_ptr必须std::shared_ptr作为std::auto_ptr. 当它变得广泛可用时,我将开始使用它。

于 2008-10-13T09:33:56.123 回答
5

我认为,如果您不介意使用 Boost ,则最好的做法是用std::auto_ptrby 的所有用途替换,boost::scoped_ptr除非std::tr1::shared_ptr更好地满足要求。另一方面,它肯定是故意的,没有包含在 TR1 中。scoped_ptr

于 2008-10-13T09:20:24.483 回答
3

我相信“包装所有指针shared_ptr”确实应该是默认模式,并且是给初级程序员的合适建议。但是,在您提到的特殊所有权情况下,auto_ptr确实更合适,应鼓励在这种情况下使用。

于 2008-10-13T09:02:41.537 回答