我们的团队最近开始对智能指针进行实验,我越来越关注我们检测和纠正内存泄漏的能力。
我明白(我想。。。)在最纯粹的意义上,智能指针很少有真正的泄漏,如果有,它通常与循环引用相关。然而,我恐怕这掩盖了内存泄漏的问题,即“不必要的和不必要的内存消耗”。
例如,当使用传统的原始指针时,如果一个对象不能正确地清理内存,我们可以运行Valgrind,在程序结束时,剩下的任何东西都是泄漏(通常这可能是在程序执行过程中不断增加的泄漏,导致严重的问题)。。。现在,有了智能指针,这些都在程序退出之前被清除了,Val差尔将不会看到任何丢失的对分配内存的引用。
总的来说,我看到了智能指针在帮助开发人员防止泄漏方面的价值,但是我们是人类,会犯错误,这就是为什么我们有调试工具的原因!
我们如何检测由于编程错误而产生的不必要的内存增长,就像我们过去对Val差伦和原始指针所做的那样?
..。编辑
( 1)愚蠢的是,我通常把瓦莱尔和Memcheck联系在一起,这就是我打算在上面使用它的方式。我为困惑而道歉。
( 2)举例说明:
考虑多线程应用程序来处理数据。第一个线程读取输入(从磁盘或网络什么),然后通过队列将数据块传递给另一个线程运行算法步骤1,步骤1的线程从其输入队列中抓取数据并将数据传递给Step2。重复,直到最终线程写出结果(到磁盘或网络)。当所有输入数据都被处理时,每个线程在完成最后一个项并程序退出后会自动终止。
现在,在执行过程中,我们的足迹显著增长,假设我们可以像我们摄入的那样快地处理数据,那么肯定会有漏洞。使用原始指针,我用Memcheck来检测这种错误,它会报告程序结束时丢失或可能丢失的内存块,我们可以跟踪并修复这些内存块。
3)在我们急于学习和应用智能指针时,我们可能使用了"shared_ptr“作为另一种类型可能更适合我们的应用程序。
发布于 2016-10-10 16:36:59
如果有显著的内存增长,您将直接看到这一点,或者使用val差尔的massif工具。
同样值得注意的是,智能指针有很多种类型。你提到了循环引用,所以你大概是在说shared_ptr
?这是循环引用存在风险的唯一情况--并不是所有智能指针都是通用的。
一般而言,按优先次序排列:
unique_ptr
很容易解释- 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
发布于 2016-10-10 16:32:54
根据我在 + std::vector memory leak中的回答
内存泄漏有很多定义--而且valgrind不会检测到仍然在范围内的东西。这是工程师和调试器的工作。(当您决定要使用仍在范围内的东西时,软件如何猜测?)
发布于 2016-10-10 16:39:27
在使用智能指针时,您必须注意的一件事是,保持彼此的std::shared_ptr<>
的类之间的循环依赖关系不会被正确清除。
恐怕这是一种没有发现的情况。
尽管可以使用std::weak_ptr<>
来解决这些问题。
https://stackoverflow.com/questions/39962705
复制相似问题