MBZ*_*MBZ 6 c++ refactoring pointers c++11
简短版本:
在现代C++中使用非智能指针是否有任何可接受的理由?
长版:
我们有一个包含大量旧C++代码的庞大产品,现在我们正在尝试将其重构为现代C++时代.除了所有旧式代码之外,还有大量的指针传递(主要是使用SAL注释来提供一些安全感),我想知道是否应该将它们全部更改为智能指针,或者可能将其中的一些保留为智能指针. ?
试图转换其中的一些代码,我最终得到了一个代码,它可以简单地论证使用智能指针.
所以问题是:是否存在使用智能指针这样的事情?
换句话说:这些天非智能指针是否有可接受的场景?
智能指针(unique_ptr和shared_ptr)应该是OWNING指针(即,负责销毁对象).使用它们的底线是,new应该将创建的任何对象推入unique_ptrASAP,以防止内存泄漏.在那之后,unique_ptr应该最终被移动:
shared_ptr如果所有权应该被共享,unique_ptr如果所有权由一个范围(一个块或对象的生命周期)来确定.release应该是罕见的.如果您的代码传递非拥有指针,则应该是:
null,(获得get)null,(获得get)unique_ptr如果呼叫的目的是转移所有权,则按值计算.(在这种情况下你需要移动它们)工厂方法应按unique_ptr值返回s.(因为那时,如果你没有指定工厂方法的返回值,则立即取消分配对象)
并查看Ali关于处理遗留代码的一些哲学观点的链接的答案.(我完全赞同)
请查看此处的演讲:http://channel9.msdn.com/Events/GoingNative/2013(尤其是 Stroustrup 的演讲)。
简短的回答是否定的,假设“现代 C++”>= c++11
长的答案是情况并非总是如此,并且尝试重组大型项目几乎总是很困难。我们思考问题的方式受到解决问题的工具的限制。在很多情况下,进行此类重构时,使用指针比尝试将基本逻辑重新表达为类和智能指针友好更有意义。我认为这并不是过度使用智能指针的情况,而是类未得到充分使用的情况。YMMV;-)