【问题标题】:Heap corruption when using delete/new in extra function在额外功能中使用删除/新建时堆损坏
【发布时间】:2017-04-01 12:06:54
【问题描述】:

在下面的代码示例中,Visual Studio 给出了错误“堆已损坏”。起初 for 循环似乎工作正常,但经过 1 或 2 次迭代后它就崩溃了。

我觉得我的函数myReAllocate 促进了某种不应该发生的内存泄漏(因为当我将其注释掉时,一切正常)。到底发生了什么?这似乎是一个非常微妙的错误。

#include <iostream>
using namespace std;

class myClass{};

void myReAllocate(myClass* c)
{
    delete c;
    c = new myClass();
}

int main(void)
{
    myClass *cc[10];

    for (int i = 0; i < 10; i++){
        cout << i << " attempt" << endl;
        cc[i] = new myClass();
        myReAllocate(cc[i]);
        delete cc[i];
    }

    return 0;
}

我尝试添加operator=,但也没有用。

myClass operator=(myClass& right) {
    myClass temp = right;
    return *this;
}

【问题讨论】:

    标签: c++ operator-overloading heap-memory new-operator delete-operator


    【解决方案1】:

    myReAllocate 获取 myClass 的地址作为参数。然后释放该地址并分配一个新对象并将其分配给局部变量。这对cc[i] 的值没有影响。因此,当您删除 cc[i] 时,您会再次删除已删除的对象。

    如果您想做类似的事情,那么您需要传递 cc[i] 的地址(或对其的引用),以便您可以更改它:

    void myReAllocate(myClass** c)
    {
        delete *c;
        *c = new myClass();
    }
    

    【讨论】:

    • 您的新功能有效。谢谢!但是为什么*c 是本地的?不是指向cc[i]吗?这不是我所需要的吗?为什么简单的void myReAllocate(myClass* c){ delete c; *c = *(new myClass()); } 不起作用?
    • 因为你在下一条指令中为它分配东西时删除了 c 。你写入已经被释放的内存。您还分配了一个永远不会被释放的对象,从而导致内存泄漏。如果你想(而且你真的应该)使用分配,然后删除删除和新建,只做分配。
    • 只使用赋值是什么意思?
    • cc[i] = myClass(); 还有 std::vector 但我假设你正在学习指针,所以这可能不利于练习。
    【解决方案2】:

    我会去参考而不是指针作为参数:

    void myReAllocate(myClass*& c)
    {
        delete c;
        c = new myClass();
    }
    

    因为这不需要更改客户端代码。 Goswin 的提议要求对 myReAllocate 的调用是:

    myReAllocate(&cc[i]);
    

    而引用允许在不改变的情况下调用它。

    【讨论】:

      猜你喜欢
      • 2013-06-04
      • 2013-04-20
      • 2013-01-23
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多