0

我遇到了内存泄漏问题,它与类中的结构数组有关(不确定它们在类中是否重要)。当我在结构上调用 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
    }
 }

当我删除一堆其他代码时,两个删除行都可以正常工作。但是,当它在那里时,第二个删除行什么也不做。同样,我从来没有从代码中得到任何错误,只是内存泄漏。此外,如果我将 arraySize 替换为 5000 之类的固定数字,那么两个删除行都可以正常工作。

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

4

1 回答 1

1

您根本没有理由在myBogusDblfor 循环内分配或删除,因为循环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()。(不过,我会使用调试器,因为与编写调试代码相比,在那里设置监视表达式要快得多。)

但总的来说,我们需要看到“一堆其他代码”。

于 2013-07-11T22:44:27.617 回答