我有一个带有一些基本构造函数的类。主要代码
C1 g = *new C1(2);
delete &g;
导致错误:
double free or corruption
这段代码不等同于
C1 *g = new C1(2);
delete g;
那是什么东西,我不明白。?
我有一个带有一些基本构造函数的类。主要代码
C1 g = *new C1(2);
delete &g;
导致错误:
double free or corruption
这段代码不等同于
C1 *g = new C1(2);
delete g;
那是什么东西,我不明白。?
假设这是 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
)因此从堆段中的某个地方返回一个内存地址,每个人都很高兴。