当前位置:  开发笔记 > 编程语言 > 正文

习惯使用std :: auto_ptr还是只使用shared_ptr?

如何解决《习惯使用std::auto_ptr还是只使用shared_ptr?》经验,为你挑选了4个好方法。

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

我的看法是使用auto_ptr可以增加代码的清晰度,正是通过添加细微差别和代码设计的指示,但另一方面,它在培训新程序员时又增加了另一个微妙的问题:他们需要理解智能指针和他们如何工作的细节.当你在任何地方只使用一个智能指针时,你可以放下一个规则"将所有指针包裹起来shared_ptr"并完成它.

你对此有何看法?



1> MSalters..:

auto_ptr在签名方面也很不错.当一个函数取一个auto_ptrby值时,就意味着它会消耗T.如果一个函数返回一个auto_ptr,很明显它放弃了所有权.这可以传达您对生命的意图.

另一方面,使用scoped_ptr暗示你不想关心的生命周期T.这也意味着您可以在更多地方使用它.两个智能指针都是有效的选择,你当然可以在一个程序中同时使用.


应该使用auto_ptr的最佳描述.

2> Michael Burr..:

为'避免std::auto_ptr'阵营提供更多弹药: auto_ptr在下一个标准(C++ 0x)中被弃用.我认为仅凭这一点就足以让任何争论使用别的东西了.

但是,正如Konrad Rudolph所提到的那样,默认替换auto_ptr应该是boost::scoped_ptr.语义scoped_ptr更接近匹配,auto_ptr并且用于类似用途.下一个C++ 09标准将有类似的名为unique_ptr.

但是,使用shared_ptr任何scoped_ptr应该使用的地方都不会破坏任何东西,如果对象永远不会被共享,那么它只会添加一点点低效率来处理引用计数.因此对于永远不会分发给另一个对象的私有成员指针 - 使用scoped_ptr.如果指针将被分发给其他东西(这包括在容器中使用它们,或者如果您想要做的只是转移所有权而不是保留或共享它) - 请使用shared_ptr.


迈克,遗憾的是没有`tr1 :: scoped_ptr`.显然他们想保持简单.我不知道TR2中的状态,但由于下一个标准将引入`unique_ptr`,我怀疑会有`scoped_ptr`.

3> Anthony Will..:

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

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

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

C++ 0x必须作为更好的替代品来std::unique_ptr补充.当它变得广泛可用时,我将开始使用它.std::shared_ptrstd::auto_ptr



4> Konrad Rudol..:

我认为这是最好的做法是替代的所有用途std::auto_ptrboost::scoped_ptr,除非std::tr1::shared_ptr符合要求更好,如果你不介意使用升压.另一方面,它肯定是故意的,scoped_ptr不包括在TR1中.

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有