关于删除分配给struct数组的动态内存感到困惑

时间:2013-07-11 22:22:31

标签: c++ struct delete-operator

我遇到了内存泄漏问题,它与类中的一个结构数组有关(不确定它们是否属于类)。当我在结构上调用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,则两个删除行都可以正常工作。

我不确定从哪里开始寻找 - 什么可能导致删除行不起作用?

1 个答案:

答案 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;。