我们的团队最近开始尝试使用智能指针,而我越来越关注我们检测和纠正内存泄漏的能力。
我理解(我认为...)从最纯粹的意义上讲,智能指针很少有真正的泄漏,如果存在,则通常与循环引用有关。但是,恐怕从“不必要的和不必要的内存消耗”的意义上讲,这掩盖了内存泄漏的问题。
例如,当使用传统的原始指针时,如果对象未能正确清理内存,我们可以运行Valgrind,并且在程序结束时,剩下的就是泄漏(通常这可能是泄漏,该泄漏在程序执行期间会继续增长)导致严重问题)。 。 。现在有了智能指针,这些都可以在程序退出之前被清除,并且Valgrind不会看到对分配的内存的任何丢失的引用。
总的来说,我看到了智能指针在帮助开发人员防止泄漏方面的值(value),但是我们是人为的并且会犯错误,这就是我们拥有调试工具的原因!
像我们过去能够处理Valgrind和原始指针那样,我们如何检测由于编程错误而导致的不希望的内存增长?
...编辑
1)
愚蠢地,我通常将Valgrind与Memcheck相关联,这就是我打算在上面使用它的方式。对于造成困惑,我深表歉意。
2)作为示例,这里是一个示例:
考虑使用多线程应用程序来处理数据。第一个线程(从磁盘或网络等)读取输入,然后通过队列将数据块传递给运行算法步骤1的另一个线程,步骤1的线程从其输入队列中抓取数据,然后将其传递给步骤2。重复直到最后一个线程将结果写出(到磁盘或网络)。处理完所有输入数据后,每个线程在完成最后一项并退出程序后会自行杀死。
现在,在执行过程中,假设我们能够以提取的速度处理数据,那么占用空间就会显着增加,肯定会有泄漏。通过使用原始指针,我曾经使用Memcheck来检测这种错误,该错误将在程序结束时报告内存丢失或可能丢失的内存块,我们可以对其进行跟踪和修复。
3)在急于学习和应用智能指针的过程中,我们可能使用了“shared_ptr”,而另一种类型可能更适合我们的应用程序。
最佳答案
如果内存显着增长,您将直接看到或使用valgrind的massif工具看到它。
还值得注意的是,智能指针的类型很多。
您提到了循环引用,所以大概是在谈论shared_ptr
吗?只有在循环引用存在风险的情况下,这才是唯一的情况-并非所有智能指针都通用。
通常,按照优先顺序:
unique_ptr
易于推断出weak_ptr
。这也有助于打破静态可预测的周期关于c++ - 是否有Valgrind用智能指针检测 “Memory Leaks”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39962705/