放开auto_ptr

时间:2011-01-26 07:45:23

标签: c++ coding-style smart-pointers auto-ptr

偶尔,对于稍纵即逝的时刻,我认为auto_ptr很酷。但大多数时候我都认识到有更简单的技术可以使它变得无关紧要。例如,如果我想自动释放一个对象,即使抛出异常,我也可以新建对象并分配给auto_ptr。很酷!但我可以更容易地创建我的对象作为局部变量,并让堆栈处理它(呃!)。

因此,当我发现google C++ coding standards禁止使用auto_ptr时,我并不感到惊讶。谷歌声明应该使用scoped_ptr(如果需要智能指针)。

我想知道,与我的经验相反,是否有人能够给出auto_ptr何时使用最佳或最简单的事物的可靠理由。如果没有,那么我想我会禁止自己使用它(跟谷歌领先)。

更新:对于那些表示担忧的人,不,我没有采用谷歌标准。例如,针对谷歌建议,我同意应该激活异常处理。我也喜欢使用预处理器宏,例如我制作的printable enum。这只是让我感到震惊的auto_ptr主题。

update2 :事实证明我的答案来自下面的两个响应者,还有一个note from Wikipedia。首先,Herb Sutter确实展示了一种有效的用途(源 - 汇成语和与生命有关的对象组成)。其次,有些商店没有TR1和boost,也没有禁止,只允许使用C ++ 03。第三,根据维基百科,C ++ 0x规范正在弃用auto_ptr并将其替换为unique_ptr。所以我的答案是:如果我可以使用unique_ptr(在所有考虑的平台上),否则使用auto_ptr来表示Sutter描述的情况。

6 个答案:

答案 0 :(得分:7)

Herb Sutter可以帮助你解决这个问题:http://www.drdobbs.com/184403837

答案 1 :(得分:7)

当你需要一个范围或唯一的指针并且你在严格的C ++ 03环境中工作而无法访问tr1实现或提升时,这是最简单的事情。

答案 2 :(得分:6)

虽然禁止auto_ptr似乎很有吸引力,但有一个问题:

template <typename T>
some_smart_ptr<T> create();

您将用{?

替换some_smart_ptr占位符

如果所有权真正被共享,那么通用答案shared_ptr是值得的,如果该函数授予调用者对资源的独占所有权,那么它最多会产生误导(以及迄今为止过早悲观化的典型情况)因为我担心)。

另一方面,在C ++ 03中,没有其他形式的智能指针可以提供:没有移动语义,在这里提供我们想要的东西是不可能的。 auto_ptr或裸指针是两个逻辑竞争者。但是,如果来电者不小心,裸指针会让你面临泄密的风险。

使用C ++ 0x,unique_ptr有利于在每种情况下替换auto_ptr

答案 3 :(得分:3)

std::auto_ptr仍然具有指针语义,因此自动(非指针)变量不是替代。特别是,std::auto_ptr支持多态和重新分配。使用堆栈变量,您可以使用多态性的引用,但引用不允许重新赋值。

有时std::auto_ptr会做得很好。例如,用于实现pimpl。确实,在绝大多数情况下,提升'智能指针库为智能指针提供了更好的选择。但是现在std::auto_ptr是标准解决方案,而boost的智能指针则不是。

答案 4 :(得分:2)

使用auto_ptr作为函数返回值,您将不会享受任何开销,也不会有内存泄漏。可以在std::auto_ptr<obj> foo()中安全地调用{ foo(); }obj *foo()则不能。 boost :: shared_ptr可以解决这个问题,但开销较高。

此外,由于内存限制,无法在堆栈上创建某些对象:线程堆栈相对较小。但是boost :: scoped_ptr在这种情况下更好,因为它不会被意外释放。

答案 5 :(得分:1)

一个原因是scoped_ptr是不可复制的,因此使用起来更安全,更难以犯错误。 auto_ptr允许转移所有权(例如,通过将另一个auto_ptr作为构造函数参数传递)。如果您需要考虑转移所有权等问题,那么使用shared_ptr等智能指针可能会让您感觉更好。