0

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

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

导致错误:

double free or corruption

这段代码不等同于

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

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

4

1 回答 1

1

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

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

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

现在,如果我没记错的话:
堆栈上的变量是自动分配和释放的,所以虽然你delete &g本身不是导致错误的,但触发它的是函数末尾的自动释放。
此外,g是指向的值的副本p,而不是对它的引用或其他东西。
Plusp根本不会被释放。

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

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

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

于 2015-06-05T09:24:01.377 回答