c++ - 增加内存占用。误报或内存泄漏?

标签 c++ windows memory-leaks

我有一个图形程序,我在其中一遍又一遍地创建和销毁相同的对象。总共有 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/

相关文章:

android - 我无法停止在Android cocos2dx中播放循环sfx

windows - 检查所有驱动器(字母和自由大小)并比较高数字自由大小

ios - OBJ-C : How to release object which is return from method?

C++:重载2个函数,一个在头文件中,一个不在

c++ - Vertex Shader 和 fragment 编译失败,与 main 冲突

python - 在 Django 产品中从 Python 2.6 升级到 Python 2.7

linux - Linux 和 Windows 中的 adobe 打印属性之间的差异

c++ - 指针内存泄漏的可能性?

haskell - 修复一个特别模糊的 Haskell 空间泄漏

c++ - 用另一个 ROI 替换 ROI