删除指向自动变量的指针

时间:2010-12-03 08:54:19

标签: c++ runtime-error undefined-behavior delete-operator memory-corruption

请查看此代码

int i = 10;                                     //line 1 
int *p = &i;                                    //line 2  
delete p;                                       //line 3 
cout << "*p = " << *p << ", i = " << i << endl; //line 4  
i = 20;                                         //line 5  
cout << "*p = " << *p << ", i = " << i << endl; //line 6  
*p = 30;                                        //line 7
cout << "*p = " << *p << ", i = " << i << endl; //line 8  

此代码的结果是什么?特别是3号线,5号线和7号线?他们是否会调用未定义的行为?什么是输出?

编辑:我尝试使用g ++运行它,它正在编译并运行良好!我在Windows 7上使用MinGW。

标准在此背景下说了什么?

3 个答案:

答案 0 :(得分:5)

如果您曾使用new动态分配指针,则只能删除指针。在这种情况下,您没有使用new分配指针,只是简单地定义并初始化它以指向int类型的局部变量。

对未使用new动态分配的指针调用delete是名为Undefined Behavior的东西。简而言之,这意味着当执行此类代码时,地球上的任何事情都可能发生,并且您无法向这个星球上的任何人投诉。

答案 1 :(得分:1)

delete p;是UB,因此无法预测或依赖任何进一步的行为。你的程序可能会立即崩溃或花掉你所有的钱,或者只是退出main()并假装什么也没发生。

答案 2 :(得分:0)

第3行肯定是未定义的行为,因为你试图删除不在堆上的地址的内存。