在额外函数中使用删除/新建时堆损坏

Phi*_*ZXX 1 c++ operator-overloading heap-memory new-operator delete-operator

在以下代码示例中,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;
}
Run Code Online (Sandbox Code Playgroud)

我尝试过添加一个operator=,但也没有帮助。

myClass operator=(myClass& right) {
    myClass temp = right;
    return *this;
}
Run Code Online (Sandbox Code Playgroud)

Gos*_*low 6

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

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

void myReAllocate(myClass** c)
{
    delete *c;
    *c = new myClass();
}
Run Code Online (Sandbox Code Playgroud)