int main()
{
int x = 3;
int* y = new int(4);
y = &x;
cout << y;
delete y;
}
它显示以下错误:
'./ a.out'中的错误:free():无效的指针:0x00007ffde8e1c0364
0x7ffde8e1c0364已中止
答案 0 :(得分:9)
y
无法删除,因为它指向该行后自动存储的对象
y = &x;
仅new
返回的地址可以删除。如果delete
的操作数具有其他值(如示例中的自动对象的地址),则程序的行为将不确定。
引用的赋值将覆盖先前的值,该值是动态分配地址的唯一副本。地址的这种丢失称为“内存泄漏”,因为无法再释放动态分配。
答案 1 :(得分:6)
答案 2 :(得分:2)
我认为您需要取消引用y
并分配给x
。
int main()
{
int x = 3;
int* y = new int(4);
*y = x;
cout << y;
delete y;
}
我没有得到任何核心转储。
答案 3 :(得分:0)
当您执行int x = 3;
时,x存储在堆栈中。在y = &x
之后,指针y指向堆栈中的元素。当您尝试删除堆栈内存时,会得到一个核心转储,因为delete
仅在分配给堆的内存上起作用。
答案 4 :(得分:0)
因为delete auto-storage-class
不支持使用operator delete
。
在语句int* y = new int(4);
中,您使用operator new
进行分配。
但是,在语句y = &x;
中,将指针更改为auto int x = 3;
。
auto
存储类变量由C / C ++运行时分配,而不由用户分配。这就是尝试和delete &x;
时出错的原因。