删除引用时双重释放或损坏
double free or corruption when deleting reference
我有一个带有一些基本构造函数的 class。 main
中的代码
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
的值)因此 returns 来自堆栈段中某处的内存地址。
现在,如果我没记错的话:
堆栈上的变量是自动分配和释放的,所以虽然你的 delete &g
本身并不是导致错误的原因,但触发它的是函数末尾的自动释放。
此外,g
是 p
指向的值的 copy,而不是对它的 reference 之类的.
另外 p
根本不会被释放。
现在,在你的第二个片段中:
C1 *g = new C1(2);
delete g;
g
是一个指针,位于堆栈上。
g
指向的位置在堆上。
g
(传递给delete
的值)因此returns堆段某处的内存地址,大家都很高兴。
我有一个带有一些基本构造函数的 class。 main
中的代码 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
的值)因此 returns 来自堆栈段中某处的内存地址。
现在,如果我没记错的话:
堆栈上的变量是自动分配和释放的,所以虽然你的 delete &g
本身并不是导致错误的原因,但触发它的是函数末尾的自动释放。
此外,g
是 p
指向的值的 copy,而不是对它的 reference 之类的.
另外 p
根本不会被释放。
现在,在你的第二个片段中:
C1 *g = new C1(2);
delete g;
g
是一个指针,位于堆栈上。
g
指向的位置在堆上。
g
(传递给delete
的值)因此returns堆段某处的内存地址,大家都很高兴。