首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否有用智能指针检测“内存泄漏”的方法?

是否有用智能指针检测“内存泄漏”的方法?
EN

Stack Overflow用户
提问于 2016-10-10 16:26:43
回答 3查看 2.2K关注 0票数 1

我们的团队最近开始对智能指针进行实验,我越来越关注我们检测和纠正内存泄漏的能力。

我明白(我想。。。)在最纯粹的意义上,智能指针很少有真正的泄漏,如果有,它通常与循环引用相关。然而,我恐怕这掩盖了内存泄漏的问题,即“不必要的和不必要的内存消耗”。

例如,当使用传统的原始指针时,如果一个对象不能正确地清理内存,我们可以运行Valgrind,在程序结束时,剩下的任何东西都是泄漏(通常这可能是在程序执行过程中不断增加的泄漏,导致严重的问题)。。。现在,有了智能指针,这些都在程序退出之前被清除了,Val差尔将不会看到任何丢失的对分配内存的引用。

总的来说,我看到了智能指针在帮助开发人员防止泄漏方面的价值,但是我们是人类,会犯错误,这就是为什么我们有调试工具的原因!

我们如何检测由于编程错误而产生的不必要的内存增长,就像我们过去对Val差伦和原始指针所做的那样?

..。编辑

( 1)愚蠢的是,我通常把瓦莱尔和Memcheck联系在一起,这就是我打算在上面使用它的方式。我为困惑而道歉。

( 2)举例说明:

考虑多线程应用程序来处理数据。第一个线程读取输入(从磁盘或网络什么),然后通过队列将数据块传递给另一个线程运行算法步骤1,步骤1的线程从其输入队列中抓取数据并将数据传递给Step2。重复,直到最终线程写出结果(到磁盘或网络)。当所有输入数据都被处理时,每个线程在完成最后一个项并程序退出后会自动终止。

现在,在执行过程中,我们的足迹显著增长,假设我们可以像我们摄入的那样快地处理数据,那么肯定会有漏洞。使用原始指针,我用Memcheck来检测这种错误,它会报告程序结束时丢失或可能丢失的内存块,我们可以跟踪并修复这些内存块。

3)在我们急于学习和应用智能指针时,我们可能使用了"shared_ptr“作为另一种类型可能更适合我们的应用程序。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-10-10 16:36:59

如果有显著的内存增长,您将直接看到这一点,或者使用val差尔的massif工具。

同样值得注意的是,智能指针有很多种类型。你提到了循环引用,所以你大概是在说shared_ptr?这是循环引用存在风险的唯一情况--并不是所有智能指针都是通用的。

一般而言,按优先次序排列:

  1. 避免(直接)动态分配-使用容器或其他专用类型来管理内存。
  2. 避免动态分配资源的复杂所有权和/或生命周期:unique_ptr很容易解释
  3. 如果您必须共享所有权,这意味着您的对象生存期本质上是不确定的,因此很难进行推理。但是,如果不泄漏“共享”对象的所有者,就不能泄漏“共享”对象,因此泄漏意味着程序结构上的一些混乱。
代码语言:javascript
运行
复制
- note that if you have references that shouldn't keep a shared object alive, you should use `weak_ptr` instead. This also serves to break statically-predictable cycles

票数 3
EN

Stack Overflow用户

发布于 2016-10-10 16:32:54

根据我在 + std::vector memory leak中的回答

内存泄漏有很多定义--而且valgrind不会检测到仍然在范围内的东西。这是工程师和调试器的工作。(当您决定要使用仍在范围内的东西时,软件如何猜测?)

票数 2
EN

Stack Overflow用户

发布于 2016-10-10 16:39:27

在使用智能指针时,您必须注意的一件事是,保持彼此的std::shared_ptr<>的类之间的循环依赖关系不会被正确清除。

恐怕这是一种没有发现的情况。

尽管可以使用std::weak_ptr<>来解决这些问题。

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

https://stackoverflow.com/questions/39962705

复制
相关文章

相似问题

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