请查看此代码
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。
标准在此背景下说了什么?
答案 0 :(得分:5)
如果您曾使用new动态分配指针,则只能删除指针。在这种情况下,您没有使用new分配指针,只是简单地定义并初始化它以指向int类型的局部变量。
对未使用new动态分配的指针调用delete是名为Undefined Behavior的东西。简而言之,这意味着当执行此类代码时,地球上的任何事情都可能发生,并且您无法向这个星球上的任何人投诉。
答案 1 :(得分:1)
delete p;
是UB,因此无法预测或依赖任何进一步的行为。你的程序可能会立即崩溃或花掉你所有的钱,或者只是退出main()
并假装什么也没发生。
答案 2 :(得分:0)
第3行肯定是未定义的行为,因为你试图删除不在堆上的地址的内存。