我有一个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];
}
}
所以最后的问题是,驻留内存以哪种方式增加,但不是虚拟,我可以说可能是内存增加,操作系统可以为进度分配更多的物理内存
答案 0 :(得分:2)
您没有提及您的平台。在像Linux这样的系统上,有一个懒惰的内存分配器。这意味着如果您调用new
来分配未初始化的内存(与int数组一样),则将分配虚拟内存,但不会分配物理内存。稍后,如果你确实为内存分配了一个值,它就会被分配。
正如nwp所说,尝试为您分配的内存分配值(通过使用类似memset
的内容或使用带有初始化类成员的构造函数的类)。