gpt4 book ai didi

c++ - C++文件输出函数中的神秘内存泄漏

转载 作者:行者123 更新时间:2023-11-30 05:20:21 26 4
gpt4 key购买 nike

我讨厌重复“这是一些代码,它有什么问题吗?”这样的陈词滥调。但我已经调查了这个问题好几天了,没有任何进展。这段代码通常会在调试器关闭的情况下立即崩溃,尽管偶尔会有几个小时的时间来编译和正确运行。附加 gdb 后它可以工作,但会以每秒约 10 MB 的速度泄漏内存,并最终在用完时崩溃。

肯定是这个函数;当对它的唯一调用被注释掉时,不会出现此类问题,并且较少调用它会延迟内存不足崩溃。

 //Write a frame of the animation to disk
void draw_frame(int framenum) {
ofstream fout;
ostringstream fname;
fname << "D:\\frames\\" << framenum << ".data";
fout.open(fname.str(), ios::binary | ios::out);

unsigned char ***frame;
frame = new unsigned char ** [WORLDSIZE];
for (int x = 0; x < WORLDSIZE; x++) {
frame[x] = new unsigned char * [WORLDSIZE];
for (int y=0; y < WORLDSIZE; y++) {
frame[x][y] = new unsigned char [3];
}
}

unsigned long long ***colormix;
colormix = new unsigned long long ** [WORLDSIZE];
for (int x = 0; x < WORLDSIZE; x++) {
colormix[x] = new unsigned long long * [WORLDSIZE];
for (int y=0; y < WORLDSIZE; y++) {
colormix[x][y] = new unsigned long long [3];
for (int z=0; z < 3; z++) {
colormix[x][y][z]=0;
}
}
}

for (vector<SmellyObject *>::iterator it = smellythings.begin(); it != smellythings.end(); ++it) {
SmellyObject *theobj = *it;
for (int x=0; x < WORLDSIZE; x++) {
for (int y=0; y < WORLDSIZE; y++) {
double scentlevel = scentmaps[theobj -> id][x][y];
double colorlevel = (scentlevel / 10000.0);
colormix[x][y][0] += theobj->r * colorlevel;
colormix[x][y][1] += theobj->g * colorlevel;
colormix[x][y][2] += theobj->b * colorlevel;
}
}
}

for (int x=0; x < WORLDSIZE; x++) {
for (int y=0; y < WORLDSIZE; y++) {
for (int z=0; z < 3; z++) {
//cout << colormix[x][y][z] << " ";
frame[x][y][z] = min(255.0, (colormix[x][y][z] / (double) smellythings.size()));
}
}
}

for (int x=0; x < WORLDSIZE; x++) {
for (int y=0; y < WORLDSIZE; y++) {
fout.write((char *) frame[x][y], 3);
}
}

fout.close();

frame = new unsigned char ** [WORLDSIZE];
for (int x = 0; x < WORLDSIZE; x++) {
frame[x] = new unsigned char * [WORLDSIZE];
for (int y=0; y < WORLDSIZE; y++) {
for (int z=0; z < WORLDSIZE; z++) {
//delete[] &frame[x][y][z];
}
delete[] frame[x][y];
}
delete[] frame[x];
}
delete[] frame;

colormix = new unsigned long long ** [WORLDSIZE];
for (int x = 0; x < WORLDSIZE; x++) {
colormix[x] = new unsigned long long * [WORLDSIZE];
for (int y=0; y < WORLDSIZE; y++) {
for (int z=0; z < WORLDSIZE; z++) {
//delete[] &colormix[x][y][z];
}
delete[](colormix[x][y]);
}
delete[](colormix[x]);
}
delete[](colormix);

return;
}

WORLDSIZE 是 50,scentmaps 是一个 std::unordered_map 映射整数(SmellyObject 的 .id 属性)到 WORLDSIZE x WORLDSIZE double 组。

最佳答案

frame = new unsigned char ** [WORLDSIZE];

您在函数的开头分配这个数组,然后继续分配它的所有三个维度,占用大量内存。

然后,以后……

fout.close();

frame = new unsigned char ** [WORLDSIZE];

...您刚刚将 frame 重新分配给另一个分配的数组。旧的 frame 指针不见了,您刚刚泄漏了最初分配的公吨内存。

与你的另一个 colormix 数组有同样的错误。

从中吸取教训:修复错误的最佳方法是从一开始就不要制造错误。如果您一直在使用能够为您正确处理所有内存分配的 C++ 容器,例如 std::vector,这将永远不会发生。正确使用 C++ 库的全部资源 - 容器、迭代器、算法 - 从逻辑上讲不会发生许多常见的编程错误。

关于c++ - C++文件输出函数中的神秘内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40695702/

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