为什么我不能删除以下指针?

时间:2019-08-28 15:55:35

标签: c++

int main()
{
    int x = 3;
    int* y = new int(4);
    y = &x;
    cout << y;
    delete y;
}

它显示以下错误:

  

'./ a.out'中的错误:free():无效的指针:0x00007ffde8e1c0364

     

0x7ffde8e1c0364已中止

5 个答案:

答案 0 :(得分:9)

y无法删除,因为它指向该行后自动存储的对象

y = &x;

new返回的地址可以删除。如果delete的操作数具有其他值(如示例中的自动对象的地址),则程序的行为将不确定。

引用的赋值将覆盖先前的值,该值是动态分配地址的唯一副本。地址的这种丢失称为“内存泄漏”,因为无法再释放动态分配。

答案 1 :(得分:6)

delete销毁先前由new分配的对象,但x未由new分配的对象。您的代码与:

int x=3;
delete &x;

另请参见:

答案 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;时出错的原因。