【问题标题】:Confused about deleting dynamic memory allocated to array of struct对删除分配给结构数组的动态内存感到困惑
【发布时间】:2013-07-10 09:15:00
【问题描述】:

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

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

【问题讨论】:

    标签: c++ struct delete-operator


    【解决方案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()。 (不过,我会使用调试器,因为与编写调试代码相比,在那里设置监视表达式要快得多。)

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

    【讨论】:

    • “一堆其他代码”可能会弄乱指针。一个好的开始是通过 valgrind 运行代码。另外,使用 std::vector。
    • 好的 - 我搞砸了这个例子。实际上,arraySize 确实发生了变化。我在那里列出的 for 循环实际上是一个以 arraySize 作为参数并被多次调用的子例程。我试图简化......我想我的主要困惑是为什么双重按预期工作而结构没有。关于弄乱指针 - 我当然看过这种可能性,但看不到任何这样做的东西。这会导致删除运算符不起作用吗?
    猜你喜欢
    • 1970-01-01
    • 2013-12-25
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多