简短版本:
在现代C++中使用非智能指针有什么可接受的理由吗?
长篇版本:
我们有一个巨大的产品,包含大量的旧C++代码,现在我们正试图将其重构到现代的C++时代。除了所有老式代码之外,还有大量的指针在传递(主要是带有SAL注释以提供某种安全性),我想知道我们是应该将它们全部更改为智能指针,还是保留其中的一些指针呢?
为了转换这些代码中的一些,我得到了一段代码,对于使用智能指针来说,这是一个简单的争论。
因此,问题是:是否存在使用智能指针之类的东西?
或者换句话:这些日子里,对于非智能指针有什么可接受的场景吗?
发布于 2013-10-17 08:33:14
智能指针(unique_ptr和shared_ptr)应该拥有指针(即,负责销毁对象)。使用它们的底线是,任何由new创建的对象都应该尽快插入到unique_ptr中,以防止内存泄漏。在此之后,unique_ptr最终将被移动:
shared_ptr,unique_ptr。release应该是罕见的。如果您的代码传递不属于自己的指针,这些指针应该是:
null,则为原始指针(由get获取)null,(由get获取)unique_ptr。(在这种情况下,你需要移动它们)工厂方法应按值返回unique_ptrs。(因为这样,如果不赋值工厂方法的返回值,则会立即取消对象的分配)
并查看Ali关于处理遗留代码的一些哲学要点的链接的答案。(我完全同意)
发布于 2013-10-17 16:20:15
简短版本: 在现代C++中使用非智能指针有什么可接受的理由吗?
简短答覆:
当然,如果他们只服务于观察,也就是说,,他们并不拥有这个切入点。但是,即使在这种情况下,也尝试使用引用而不是指针;只有在确实需要使指针可选时才使用指针(例如,用null_ptr初始化,然后稍后重新分配)。
长篇版本: 我们有一个巨大的产品,包含大量的旧C++代码,现在我们正试图将其重构到现代的C++时代。..。
较长的答覆:
当我读到这几行的时候,我想到了这个答案:
我希望我能不止一次地提出这个答案。我要引用这样的话:“.对于我们所做的每一个因素,我们都可以证明‘这一具体的改变将使我们现在所做的实际任务变得更容易’,而不是‘这对于未来的工作来说更清洁’。”
长话短说,除非你真的需要,否则不要做大的重构。
因此,问题是:是否存在使用智能指针之类的东西?
在我看来,std::shared_ptr被过度使用了。它是非常舒适的使用,它给你的错觉,你不需要考虑所有权问题。但这并不是全貌。我完全同意肖恩父母的观点:“共享指针和全局变量一样好。”共享指针也会带来非常困难的所有权问题,等等。
另一方面,如果您需要在堆上分配一些东西,请使用unique_ptr。如果确实需要堆分配,就不能过度使用它。在我的经验中,使用unique_ptr还可以使代码更清晰、更容易理解,因为所有权问题变得不言自明。
Sean就如何避免/减少指针的使用进行了有趣的讨论:
希望这能有所帮助。
发布于 2013-10-17 09:02:27
是的,原始指针仍然有“可选引用”的用途。也就是说,T*类似于T&。两者都不意味着所有权,但T*可以是nullptr。
https://stackoverflow.com/questions/19417574
复制相似问题