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