删除引用时双重释放或损坏

时间:2015-06-05 08:28:02

标签: c++ reference double-free

我有一个带有一些基本构造函数的类。主要代码

 C1 g = *new C1(2);
 delete &g;

会导致错误:

double free or corruption

这段代码不等于

C1 *g = new C1(2);
delete g;

那是什么东西,我不明白。?

1 个答案:

答案 0 :(得分:1)

假设这是C ++,您的第一个片段相当于

C1 *p = new C1(2);
C1 g = *p;
delete &g;

p是一个指针,位于堆栈上 位置p指向堆上的位置 gC1,位于堆栈上 因此,&g(传递给delete的值)会从堆栈段中的某个位置返回内存地址。

现在,如果我没有弄错的话:
堆栈上的变量会自动分配和释放,因此虽然delete &g本身不会导致错误,但是在触发它的函数末尾会自动释放。 另外,gp指向的值的副本,而不是引用。<
p根本不会被取消分配。

现在,在你的第二个片段中:

C1 *g = new C1(2);
delete g;

g是一个指针,位于堆栈上 g指向的位置位于堆上。 g(传递给delete的值)因此从堆段中的某个地方返回一个内存地址,每个人都很高兴。