【发布时间】:2011-01-26 07:45:23
【问题描述】:
有时,对于稍纵即逝的时刻,我认为 auto_ptr 很酷。但大多数时候,我认识到有更简单的技术使它变得无关紧要。例如,如果我想自动释放一个对象,即使抛出异常,我也可以新建对象并分配给 auto_ptr。很酷!但我可以更轻松地将我的对象创建为局部变量,并让堆栈来处理它(呃!)。
因此,当我发现google C++ coding standards 禁止使用 auto_ptr 时,我并没有太惊讶。 Google 声明应该使用 scoped_ptr(如果需要智能指针)。
我想知道是否有人可以根据我的经验给出充分的理由说明 auto_ptr 何时是最好或最简单的东西。如果没有,那么我想我会禁止自己使用它(按照谷歌的引导)。
更新:对于那些表示担忧的人,不,我没有采用谷歌标准。例如,根据谷歌的建议,我同意应该激活异常处理。我也喜欢使用预处理器宏,比如我制作的printable enum。让我印象深刻的只是 auto_ptr 主题。
update2:原来我的回答来自下面的两个响应者和一个note from Wikipedia。首先,Herb Sutter 确实展示了一个有效的用途(源-汇成语和生命周期关联的对象组合)。其次,有些商店 TR1 和 boost 不可用或被禁止,只允许使用 C++03。第三,根据 Wikipedia,C++0x 规范正在弃用 auto_ptr 并将其替换为 unique_ptr。所以我的回答是:如果我可以使用 unique_ptr(在考虑的所有平台上),则使用 auto_ptr 用于 Sutter 描述的情况。
【问题讨论】:
-
谷歌风格指南也禁止例外。我们会禁止例外,因为有人弄错了,谷歌风格指南禁止了它们吗?没有。
-
不要遵循 Google 的指导方针,一般来说,它们是针对它们的,并且需要与其庞大的 C 代码库集成。 (虽然有很多理由不使用
auto_ptr)。
标签: c++ coding-style smart-pointers auto-ptr