我有一类带有一些基本构造函数的类。主代码
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
,而不是对其的引用或其他内容。
加号p
根本不会释放。
现在,在第二个片段中:
C1 *g = new C1(2);
delete g;
g
是一个指针,位于堆栈上。
指向的位置g
位于堆上。g
(传递给的值delete
)因此从堆段中的某处返回一个内存地址,并且每个人都很高兴。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句