在额外函数中使用delete / new时堆积损坏

时间:2017-04-01 12:06:54

标签: c++ operator-overloading heap 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;
}

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

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

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:1)

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

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

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

myReAllocate(&cc[i]);

虽然引用允许在不做更改的情况下调用它。