我遇到了内存泄漏问题,它与类中的一个结构数组有关(不确定它们是否属于类)。当我在结构上调用delete时,内存不会被清除。当我使用与int和dbl完全相同的进程时,它可以正常工作并释放内存。
我创建了非常简单的示例,它们正常工作,因此它与代码中的其他内容有关,但我不确定它是什么。我从来没有得到任何错误,代码正确执行。但是,分配/解除分配在循环中发生,因此内存使用量不断增加。
换句话说,这是问题的摘要:
struct myBogusStruct {
int bogusInt1, bogusInt2;
};
class myBogusClass {
public:
myBogusStruct *bogusStruct;
};
void main(void) {
int i, arraySize;
double *bogusDbl;
myBogusClass bogusClass;
// arraySize is read in from an input file
for(i=0;i<100;i++) {
bogusDbl = new double[arraySize];
bogusClass.bogusStruct = new myBogusStruct[arraySize];
// bunch of other code
delete [] bogusDbl; // this frees memory
delete [] bogusClass.bogusStruct; // this does not free memory
}
}
当我删除其他代码时,两个删除行都能正常工作。但是当它在那里时,第二个删除行什么都不做。同样,我从来没有从代码中得到任何错误,只是内存泄漏。此外,如果我用固定数字(如5000)替换arraySize,则两个删除行都可以正常工作。
我不确定从哪里开始寻找 - 什么可能导致删除行不起作用?
答案 0 :(得分:1)
根本没有理由在for循环中分配或删除myBogusDbl
,因为arraySize
永远不会在循环内部发生变化。
同样适用于myBogusClass.myBogusStruct
。没有理由在循环中分配/删除它:
myBogusDbl = new double[arraySize];
myBogusClass.myBogusStruct = new bogusStruct[arraySize];
for (i = 0; i < 100; i++) {
// bunch of other code
}
delete[] myBogusDbl;
delete[] myBogusClass.myBogusStruct;
您还应该考虑使用std::vector
而不是使用原始内存分配。
现在可能的原因是为什么原始代码中的第二次删除没有做任何事情:根据定义,删除NULL指针确实没有。这是一个无操作。因此,出于调试目的,请在删除之前尝试引入测试以查看它是否为NULL以及是否为abort()。 (不过我使用调试器,因为与编写调试代码相比,设置监视表达式的速度要快得多。)
总的来说,我们需要看到&#34;其他代码&#34;。