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

问题描述:

我有一个C++程序,其驻留内存增加缓慢,而其虚拟内存基本上保持不变。那么这是内存泄漏吗?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]; 
    } 
} 

所以最后一个问题,在这种方式驻留存储器增加,但不是虚拟的,我可以说可能是空闲的内存增加,操作系统可以分配更多的物理内存进度

+2

您正在运行的操作系统/运行时足够聪明,可以注意到您从未实际使用过您分配的内存。它只会将记忆标记为“保留”给你,但在你使用它之前不会实际给你。尝试将一些数据写入分配的内存并查看它的变化。 – nwp

+4

有一个'new'没有匹配'delete'就是内存泄漏,句号。 – NathanOliver

+3

这是一个没有明显副作用的无限循环。这是未定义的行为。 –

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

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