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];
}
}
所以最后一个问题,在这种方式驻留存储器增加,但不是虚拟的,我可以说可能是空闲的内存增加,操作系统可以分配更多的物理内存进度
答
你没有提到你的平台。在像Linux这样的系统上,有一个懒惰的内存分配器。这意味着如果你调用new
来分配未初始化的内存(就像你的int数组一样),那么将分配虚拟内存,但不分配物理内存。稍后,如果您确实为内存分配了一个值,那么它将得到分配。
正如nwp所说,尝试将值分配给您分配的内存(通过使用类似memset
或使用具有初始化类成员的构造函数的类)。
您正在运行的操作系统/运行时足够聪明,可以注意到您从未实际使用过您分配的内存。它只会将记忆标记为“保留”给你,但在你使用它之前不会实际给你。尝试将一些数据写入分配的内存并查看它的变化。 – nwp
有一个'new'没有匹配'delete'就是内存泄漏,句号。 – NathanOliver
这是一个没有明显副作用的无限循环。这是未定义的行为。 –