在现代C++中使用非智能指针

MBZ*_*MBZ 6 c++ refactoring pointers c++11

简短版本:
在现代C++中使用非智能指针是否有任何可接受的理由?

长版:
我们有一个包含大量旧C++代码的庞大产品,现在我们正在尝试将其重构为现代C++时代.除了所有旧式代码之外,还有大量的指针传递(主要是使用SAL注释来提供一些安全感),我想知道是否应该将它们全部更改为智能指针,或者可能将其中的一些保留为智能指针. ?
试图转换其中的一些代码,我最终得到了一个代码,它可以简单地论证使用智能指针.

所以问题是:是否存在使用智能指针这样的事情?
换句话说:这些天非智能指针是否有可接受的场景?

Lau*_*ZZA 5

智能指针(unique_ptrshared_ptr)应该是OWNING指针(即,负责销毁对象).使用它们的底线是,new应该将创建的任何对象推入unique_ptrASAP,以防止内存泄漏.在那之后,unique_ptr应该最终被移动:

  • 或者成shared_ptr如果所有权应该被共享,
  • 或成unique_ptr如果所有权由一个范围(一个块或对象的生命周期)来确定.

release应该是罕见的.如果您的代码传递非拥有指针,则应该是:

  • 原始指针,如果他们可能null,(获得get)
  • 参考,如果他们可能不是null,(获得get)
  • unique_ptr如果呼叫的目的是转移所有权,则按值计算.(在这种情况下你需要移动它们)

工厂方法应按unique_ptr值返回s.(因为那时,如果你没有指定工厂方法的返回值,则立即取消分配对象)

并查看Ali关于处理遗留代码的一些哲学观点的链接的答案.(我完全赞同)


Dwe*_*rly 0

请查看此处的演讲:http://channel9.msdn.com/Events/GoingNative/2013(尤其是 Stroustrup 的演讲)。

简短的回答是否定的,假设“现代 C++”>= c++11

长的答案是情况并非总是如此,并且尝试重组大型项目几乎总是很困难。我们思考问题的方式受到解决问题的工具的限制。在很多情况下,进行此类重构时,使用指针比尝试将基本逻辑重新表达为类和智能指针友好更有意义。我认为这并不是过度使用智能指针的情况,而是类未得到充分使用的情况。YMMV;-)