在下面的代码示例中,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;
}
答案 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]);
虽然引用允许在不做更改的情况下调用它。