C++ 私有脏内存是否可以表示内存泄漏?
我有一个应用程序,它的内存随着我运行的测试用例而增加。这显然让我相信我的应用程序正在泄漏内存。所以我对我的应用程序运行valgrind,令人惊讶的是它没有发现任何泄漏 我不确定我的进程的内存为什么会泄漏,所以我查看了进程的smaps文件 下面,如果我觉得有趣的话C++ 私有脏内存是否可以表示内存泄漏?,c++,linux,memory,memory-management,memory-leaks,C++,Linux,Memory,Memory Management,Memory Leaks,我有一个应用程序,它的内存随着我运行的测试用例而增加。这显然让我相信我的应用程序正在泄漏内存。所以我对我的应用程序运行valgrind,令人惊讶的是它没有发现任何泄漏 我不确定我的进程的内存为什么会泄漏,所以我查看了进程的smaps文件 下面,如果我觉得有趣的话 08426000-42f56000 rwxp 00000000 00:00 0 [heap] Size: 961728 kB Rss:
08426000-42f56000 rwxp 00000000 00:00 0 [heap]
Size: 961728 kB
Rss: 960252 kB
Pss: 960252 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 960252 kB
Referenced: 960252 kB
Anonymous: 960252 kB
AnonHugePages: 0 kB
Swap: 0 kB
KernelPageSize: 4 kB
为了弄清楚这些数字,我对私有脏内存做了一些研究,大多数文章都指出这是一个由于成本高昂而尚未释放的内存
这似乎表明这些只是应用程序释放的内存,但操作系统仍保留着这些内存
有人能帮我更好地理解私人关系吗?这可能是我内存泄漏的迹象吗
感谢似乎是内存在等待写入磁盘,系统需要花费一些时间来完成。您的程序必须产生大量结果,并将其写入磁盘文件
在执行清理步骤之后,例程退出之前,内存是否会变小?这听起来像是你抓住了一些与测试用例相关的东西,这会导致记忆被保留。您是使用共享指针还是直接处理内存管理?这里有一个关于什么是私有脏内存的描述:基本上,您的进程已经“使用”(写入)了内存,因此,如果为了给另一个进程腾出空间而进行交换,则需要保存内存。这本身并不表示您正在泄漏内存。可能您正在分配大量小容量内存,然后又取消分配。我不能预测太多,但它与内存碎片有什么关系吗?你可能没有内存泄漏——在内存尚未释放但不再有引用/指针的意义上——但听起来你可能有所谓的内存累积——你不断为新数据分配新空间,但不释放/取消分配/取消引用您不再需要的旧内存。我会更仔细地看看您认为您正在释放不再需要的内存的地方。您似乎在做一些不强制磁盘写入(脏页累积)的事情,除非在最后构建了一个干净的出口。某个地方你没有跟上你的簿记。也许会刷新一些文件指针?还是关闭并重新打开它们?