删除引用时的双重自由或损坏

double free or corruption when deleting reference

本文关键字:自由 损坏 引用 删除      更新时间:2023-10-16

我有一个带有一些基本构造函数的类。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指向的位置位于堆上。
gC1,位于堆栈上。
因此,&g(传递给delete的值)从堆栈段的某个地方返回一个内存地址。

现在,如果我没弄错的话:
堆栈上的变量是自动分配和释放的,所以当你的delete &g本身不会导致错误时,是函数末尾的自动释放触发了它。此外,gp指向的值的复制,而不是对它的引用。另外,p不会被释放。

现在,在第二个代码片段中:

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

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