c ++:当驻留内存缓慢增加时是否存在内存泄漏?

时间:2017-08-30 14:22:56

标签: c++ memory-leaks

我有一个c ++程序,其驻留内存缓慢增加,而其虚拟内存基本保持不变。这是内存泄漏吗?

在阅读了一些文章并运行一些测试后,我发现如果可用内存是2G(使用free命令),并运行此代码:

int main() {
    while (1) {
        int* a = new int[100000];
    }
}

使用top命令查看驻留内存小于2G,并保持不变,但虚拟内存增长如此之快。

所以我是否可以这么说

  • 当存在内存泄漏时,虚拟内存必须增加。

  • 但如果驻留内存上下移动,虚拟内存保持不变,则不是内存泄漏

编辑:我在linux上这样做

我重写了我的代码:

#include <iostream>
int main() {
    while (1) {
        int* a = new int[100000];
        std::memset(a, 0, sizeof(a));
        a[0] += 1;
    }
}

和自由命令: total used free shared buffers cached Mem: 3 0 3 0 0 0 -/+ buffers/cache: 0 3 Swap: 3 0 3

上面运行代码时:

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8518 wq 20 0 358g 2.9g 704 R 53.9 73.8 0:09.13 a.out

RES增加到~3g,然后停止,同样代码如下:

    #include <iostream>
int main() {
    while (1) {
        int* a = new int[100000];
    }
}

所以最后的问题是,驻留内存以哪种方式增加,但不是虚拟,我可以说可能是内存增加,操作系统可以为进度分配更多的物理内存

1 个答案:

答案 0 :(得分:2)

您没有提及您的平台。在像Linux这样的系统上,有一个懒惰的内存分配器。这意味着如果您调用new来分配未初始化的内存(与int数组一样),则将分配虚拟内存,但不会分配物理内存。稍后,如果你确实为内存分配了一个值,它就会被分配。

正如nwp所说,尝试为您分配的内存分配值(通过使用类似memset的内容或使用带有初始化类成员的构造函数的类)。