gpt4 book ai didi

c++ - 是否有用于使用智能指针检测 "Memory Leaks"的 Valgrind

转载 作者:行者123 更新时间:2023-11-30 01:09:37 24 4
gpt4 key购买 nike

我们的团队最近开始试验智能指针,我越来越担心我们检测和纠正内存泄漏的能力。

我理解(我认为......)从最纯粹的意义上讲,智能指针很少有真正的泄漏,如果有,它通常与循环引用有关。但是,恐怕这在“不需要和不必要的内存消耗”的意义上掩盖了内存泄漏的问题。

例如,当使用传统的原始指针时,如果一个对象未​​能正确清理内存,我们可以运行 Valgrind,在程序结束时,剩下的就是泄漏(通常这可能是一个继续增长的泄漏在程序执行期间导致严重问题)。 . .现在有了智能指针,这些都在程序退出前被清理干净,Valgrind 不会看到任何丢失的已分配内存引用。

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

我们如何检测由于编程错误导致的不必要的内存增长,就像我们过去能够使用 Valgrind 和原始指针所做的那样?

...编辑

1)愚蠢的是,我通常将 Valgrind 与 Memcheck 联系起来,这就是我打算在上面使用它的方式。我为困惑道歉。

2) 举个例子:

考虑使用多线程应用程序来处理数据。第一个线程读取输入(无论是从磁盘还是网络),然后通过队列将数据 block 传递给运行算法步骤 1 的另一个线程,Step1 的线程从其输入队列中获取数据并执行其操作并将数据传递给 Step2。重复直到最后一个线程写出结果(到磁盘或网络)。当所有的输入数据都处理完后,每个线程在完成最后一项后自行终止,程序退出。

现在,在执行过程中,我们的足迹显着增加,假设我们处理数据的速度与我们摄取数据的速度一样快,那么一定存在泄漏。我曾经使用原始指针来检测 Memcheck 的这种错误,它会在程序结束时报告丢失或可能丢失的内存块,我们可以追踪并修复。

3) 在我们匆忙学习和应用智能指针的过程中,我们可能使用了“shared_ptr”,因为另一种类型可能更适合我们的应用。

最佳答案

如果内存增长显着,您将直接看到或使用 valgrind 的 massif 工具。

还值得注意的是,智能指针有多种类型。你提到循环引用,所以大概你在谈论 shared_ptr?这是循环引用存在风险的唯一情况 - 它并非对所有智能指针都是通用的。

一般来说,按优先顺序:

  1. 避免(直接)动态分配 - 使用容器或其他专用类型来管理内存
  2. 避免复杂的所有权和/或动态分配资源的生命周期:unique_ptr 很容易推理
  3. 如果您必须共享所有权,这意味着您的对象生命周期本质上是不确定的,因此很难推理。但是,您不能在不泄露其所有者的情况下泄露“共享”对象,因此泄露意味着您的程序结构更高层存在一些困惑

    • 请注意,如果您有不应使共享对象保持事件状态的引用,则应改用 weak_ptr。这也有助于打破静态可预测的循环

关于c++ - 是否有用于使用智能指针检测 "Memory Leaks"的 Valgrind,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39962705/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com