首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在现代C++中使用非智能指针

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

Stack Overflow用户
提问于 2013-10-17 03:08:56
回答 5查看 1.4K关注 0票数 7

简短版本:

在现代C++中使用非智能指针有什么可接受的理由吗?

长篇版本:

我们有一个巨大的产品,包含大量的旧C++代码,现在我们正试图将其重构到现代的C++时代。除了所有老式代码之外,还有大量的指针在传递(主要是带有SAL注释以提供某种安全性),我想知道我们是应该将它们全部更改为智能指针,还是保留其中的一些指针呢?

为了转换这些代码中的一些,我得到了一段代码,对于使用智能指针来说,这是一个简单的争论。

因此,问题是:是否存在使用智能指针之类的东西?

或者换句话:这些日子里,对于非智能指针有什么可接受的场景吗?

EN

回答 5

Stack Overflow用户

发布于 2013-10-17 08:33:14

智能指针(unique_ptrshared_ptr)应该拥有指针(即,负责销毁对象)。使用它们的底线是,任何由new创建的对象都应该尽快插入到unique_ptr中,以防止内存泄漏。在此之后,unique_ptr最终将被移动:

  • 如果所有权应该共享的话,可以转换为shared_ptr
  • 如果所有权由(块的范围或对象的生存期)确定,则为unique_ptr

release应该是罕见的。如果您的代码传递不属于自己的指针,这些指针应该是:

  • 如果可能是null,则为原始指针(由get获取)
  • 如果引用可能不是null,(由get获取)
  • 如果调用的目的是转移所有权,则按值计算unique_ptr。(在这种情况下,你需要移动它们)

工厂方法应按值返回unique_ptrs。(因为这样,如果不赋值工厂方法的返回值,则会立即取消对象的分配)

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

票数 5
EN

Stack Overflow用户

发布于 2013-10-17 16:20:15

简短版本: 在现代C++中使用非智能指针有什么可接受的理由吗?

简短答覆:

当然,如果他们只服务于观察,也就是说,,他们并不拥有这个切入点。但是,即使在这种情况下,也尝试使用引用而不是指针;只有在确实需要使指针可选时才使用指针(例如,用null_ptr初始化,然后稍后重新分配)。

长篇版本: 我们有一个巨大的产品,包含大量的旧C++代码,现在我们正试图将其重构到现代的C++时代。..。

较长的答覆:

当我读到这几行的时候,我想到了这个答案:

我希望我能不止一次地提出这个答案。我要引用这样的话:“.对于我们所做的每一个因素,我们都可以证明‘这一具体的改变将使我们现在所做的实际任务变得更容易’,而不是‘这对于未来的工作来说更清洁’。”

长话短说,除非你真的需要,否则不要做大的重构。

因此,问题是:是否存在使用智能指针之类的东西?

在我看来,std::shared_ptr被过度使用了。它是非常舒适的使用,它给你的错觉,你不需要考虑所有权问题。但这并不是全貌。我完全同意肖恩父母的观点:“共享指针和全局变量一样好。”共享指针也会带来非常困难的所有权问题,等等。

另一方面,如果您需要在堆上分配一些东西,请使用unique_ptr。如果确实需要堆分配,就不能过度使用它。在我的经验中,使用unique_ptr还可以使代码更清晰、更容易理解,因为所有权问题变得不言自明。

Sean就如何避免/减少指针的使用进行了有趣的讨论:

  • 继承是邪恶的基类
  • 价值语义与基于概念的多态性

希望这能有所帮助。

票数 4
EN

Stack Overflow用户

发布于 2013-10-17 09:02:27

是的,原始指针仍然有“可选引用”的用途。也就是说,T*类似于T&。两者都不意味着所有权,但T*可以是nullptr

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19417574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档