gpt4 book ai didi

c++ - C++ 中 mpfr 变量动态数组的内存泄漏

转载 作者:行者123 更新时间:2023-11-28 07:17:03 26 4
gpt4 key购买 nike

我有一个简单的 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)。这适用于尺寸 ~< 200 但如果我声明更大的东西,当我再次减小尺寸时,内存似乎没有被释放。

这是一个运行示例:我启动程序并选择大小 50。然后我在 50、100、150 和 200 之间更改大小,然后看到内存使用量按预期上下波动。然后我选择大小 250,内存使用量按预期上升,但当我回到 200 时,它并没有减少,而是增加到类似于大小 200 和 250 分别所需的内存值的总和。较大的尺寸会出现类似的行为。

知道发生了什么吗?

最佳答案

Process Explorer 与任务管理器相比,您可以更真实地了解进程的内存使用情况(虚拟大小)。内存泄漏是指程序不应该释放内存,如果这种情况一直发生,它的内存将永远不会停止增加。

Windows 不一定会将您的程序内存释放回系统本身 - 因此任务管理器等不会告诉您全部真相。

要检测 visual studio 中的内存泄漏,您可以启用 _CRTDBG_MAP_ALLOC 宏,如 this MSDN page 中所述。 .

还有 this question谈了一些关于让它与 C++ new 关键字一起工作的问题。

关于c++ - C++ 中 mpfr 变量动态数组的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20071705/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com