C++ 代码内存泄漏

Posted

技术标签:

【中文标题】C++ 代码内存泄漏【英文标题】:C++ code memory leak 【发布时间】:2013-08-21 12:52:41 【问题描述】:

我在 Linux 下的 ARM CPU 硬件上执行 C++ 代码。我在硬件上运行我的二进制文件并继续监视我的进程,以查看它的内存使用量是否随着时间的推移而增长,每半小时间隔一次。

top -p pid-of-process

查看列:RES顶部输出中的内存和内存百分比

还要检查

cat /proc/pid-of-process/status 

查看字段VMRSS:这是我的进程的驻留集大小内存。

我看到 VMRSS 和 RES 内存每 1 小时不断增加数百千字节。进程只是在运行,没有测试在运行,所以它一直在做同样的事情,负载没有变化。

现在我的问题是:这是否意味着我的代码中可能存在内存泄漏。

或者这种增加是否归因于其他原因(如果有的话)?

检查是否存在内存泄漏:

    我查看了代码,发现每个新的(动态内存运算符)都有相应的删除(空闲内存)

    在 valgrind memcheck 上运行了整个过程,在报告中没有看到任何泄漏。我看到了

肯定丢失:0 个块中的 0 个字节

间接丢失:0 个块中的 0 个字节

可能丢失:7 个块中的 1,008 个字节

**编辑:在下面回答 arne 的评论。可能丢失的块来自 pthread_create 和更高版本的 glibc,所以不确定这是怎么回事/发生了什么?

56 个丢失记录 27 中可能丢失了 5 个块中的 720 个字节

==11151== at 0x402732C: calloc (vg_replace_malloc.c:467)

==11151== by 0x4010C34: allocate_dtv (dl-tls.c:300)

==11151== 0x40113D8:_dl_allocate_tls (dl-tls.c:464)

==11151== by 0x404746C: pthread_create@@GLIBC_2.1 (allocatestack.c:571)**

随着时间的推移,这种内存增加会是什么?如何进一步调试以找到原因?

【问题讨论】:

您是否重新检查过“可能丢失”的内存区域?它恰好等于 1k,因此每小时可能有几百 k。 valgrind 只检查“孤立”(或“废弃”)的内存。很高兴接受vector<int> v; int i=0; for(;;) v.push_back(i++); 或类似的东西。换句话说,以荒谬的方式“收集”数据的功能没有帮助。当然,如果你运气不好,这可能发生在一些帮助库中,而不是你自己的代码中。 @Mats Petersson 在对代码进行初步审查时,我认为没有使用任何 C++ STL/libstdc++ 容器,甚至以正常方式使用标准数据类型数组 @arne - 已编辑我的 OP 以回复您的评论。 @goldenmean:是的,但你可能确实有某种容器(链表、动态数组或类似的)——它不必是 STL 来“收集数据直到内存已满” .如果您的应用程序的内存在增长,则可能有一些东西正在某处“收集”数据。 【参考方案1】:

由于您找不到直接的泄漏,您似乎需要比较内存状态的快照以查看发生了什么变化。快速搜索表明valgrind的massif可以做snapshot,有python script可以比较它们(但如果你的程序很小,可能你可以手动比较)

【讨论】:

以上是关于C++ 代码内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

C++ 代码内存泄漏

C++:OpenMP 并行循环内存泄漏

什么调试器可以检查 C++ 代码是不是存在内存泄漏? [复制]

linux中内存泄漏的检测记录泄漏的大小

c++ 内存泄漏问题

这个 C++ 代码会泄漏内存吗?