偶尔,对于稍纵即逝的时刻,我认为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描述的情况。
答案 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
等智能指针可能会让您感觉更好。