我有一个图形程序,我在其中一遍又一遍地创建和销毁相同的对象。总共有 140 个对象。它们被删除和更新,这样数字永远不会增加 140。这是一个要求,因为它是一个压力测试,也就是说我不能有内存池或虚拟对象。现在我相当确定没有任何内存泄漏。我还在使用未报告任何泄漏的内存泄漏检测器。
问题是程序的内存占用量不断增加(尽管非常缓慢,比对象被销毁/创建的速度慢)。那么我的问题是,内存占用量的增加是否是内存泄漏的可靠标志,或者它有时可能是骗人的?
EDIT: I am using new/delete to create/destroy the objects
最佳答案
这种行为似乎确实可能来自没有泄漏的情况。
您的堆是否有可能获得 fragmented ?
假设您进行了很多大小为 n
的分配。您将它们全部释放,这使得您的 C 库将这些缓冲区插入到一个空闲列表中。然后一些其他代码路径使分配小于 n
,因此空闲列表中的那些 block 被分成更小的单元。然后循环的下一次迭代执行另一批大小为 n
的分配,并且空闲列表不再包含该大小的连续内存,并且 malloc
必须询问内核以获得更多内存。最终那些“小于-n
”的分配会像您的“n
-sized”分配一样被释放,但是如果您在存在碎片的地方运行足够多的迭代,我可以看到该过程逐渐增加其内存占用量。
避免这种情况的一种方法可能是一次性分配所有对象,而不是继续分配/释放它们。由于您使用的是 C++,因此可能需要 placement new或类似的东西。由于您使用的是 Windows,我可能还会提到 Win32 支持 having multiple heaps在一个进程中,因此如果您的对象来自与其他分配不同的堆,您可以避免这种情况。
关于c++ - 增加内存占用。误报或内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4064763/