在额外函数中使用 delete/new 时堆损坏
Heap corruption when using delete/new in extra function
在下面的代码示例中 Visual Studio 给出了错误 "A heap has been corrupted"。起初 for-loop 似乎工作正常,但在 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;
}
myReAllocate
获取 myClass 的地址作为参数。然后释放该地址并分配一个新对象并将其分配给局部变量。这对 cc[i]
的值没有影响。因此,当您删除 cc[i] 时,您会再次删除已删除的对象。
如果你想做类似的事情,那么你需要传递 cc[i] 的地址(或对它的引用)以便你可以更改它:
void myReAllocate(myClass** c)
{
delete *c;
*c = new myClass();
}
我会去参考而不是指针作为参数:
void myReAllocate(myClass*& c)
{
delete c;
c = new myClass();
}
因为这不需要更改客户端代码。 Goswin 的提案要求对 myReAllocate 的调用为:
myReAllocate(&cc[i]);
而引用允许在不进行更改的情况下调用它。
在下面的代码示例中 Visual Studio 给出了错误 "A heap has been corrupted"。起初 for-loop 似乎工作正常,但在 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;
}
myReAllocate
获取 myClass 的地址作为参数。然后释放该地址并分配一个新对象并将其分配给局部变量。这对 cc[i]
的值没有影响。因此,当您删除 cc[i] 时,您会再次删除已删除的对象。
如果你想做类似的事情,那么你需要传递 cc[i] 的地址(或对它的引用)以便你可以更改它:
void myReAllocate(myClass** c)
{
delete *c;
*c = new myClass();
}
我会去参考而不是指针作为参数:
void myReAllocate(myClass*& c)
{
delete c;
c = new myClass();
}
因为这不需要更改客户端代码。 Goswin 的提案要求对 myReAllocate 的调用为:
myReAllocate(&cc[i]);
而引用允许在不进行更改的情况下调用它。