放开auto_ptr

Bre*_*ias 5 c++ coding-style smart-pointers auto-ptr

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

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

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

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

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

Dav*_*ons 7

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


CB *_*ley 7

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


Mat*_* M. 6

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

template <typename T>
some_smart_ptr<T> create();
Run Code Online (Sandbox Code Playgroud)

您将some_smart_ptr用什么替换占位符?

shared_ptr如果所有权真正被共享,那么通用答案是值得的,如果函数授予调用者对资源的独占所有权,那么它最多会产生误导(就我而言,这是一个典型的过早悲观化案例).

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

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