我有一个简单的c ++程序,使用多精度库MPFR编写,试图在更大的程序中理解内存问题:
int main() {
int prec=65536, size=1, newsize=1;
mpfr_t **mf;
while(true) {
size=newsize;
mf=new mpfr_t*[size];
for(int i=0;i<size;i++) {
mf[i]=new mpfr_t[size];
for(int j=0;j<size;j++) mpfr_init2(mf[i][j], prec);
}
cout << "Size of array: ";
cin >> newsize;
for(int i=0;i<size;i++) {
for(int j=0;j<size;j++) mpfr_clear(mf[i][j]);
delete [] mf[i];
}
delete [] mf;
}
}
这里的要点是声明不同大小的数组并使用任务管理器监视内存使用情况(我正在使用Windows)。这适用于尺寸〜&lt; 200但是如果我声明更大的东西,当我再次减小尺寸时,内存似乎不会被释放。
这是一个示例运行: 我启动程序并选择大小50.然后我在50,100,150和200之间更改大小,并按预期方式查看内存使用情况。然后我选择大小250并且内存使用率按预期上升但是当我回到200时它不会减少但是增加到类似于大小200和250所需的内存值之和。可以看到更大尺寸的类似行为。
知道发生了什么事吗?
答案 0 :(得分:1)
Process Explorer 将为您提供比任务管理器更真实的流程内存使用情况(虚拟大小)视图。内存泄漏是指一个程序没有释放内存,如果这种情况一直发生,它的内存永远不会停止增加。
Windows不一定会将程序的内存释放回系统本身 - 因此任务管理器等不会告诉你全部真相。
要检测visual studio中的内存泄漏,您可以启用_CRTDBG_MAP_ALLOC
宏,如this MSDN page所述。
此外this question还谈到了如何使用C ++ new
关键字。