这个问题在这里已经有一个答案:

请查看此代码

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。

标准在这种情况下怎么说?

有帮助吗?

解决方案

如果您曾经使用新的新分配,则只能删除指针。在这种情况下,您尚未使用新的新指针分配指针,而是简单地定义并初始化了它以指向INT类型的局部变量。

调用删除在指针上,而不是使用新的新分配,这就是称为 不确定的行为. 。简而言之,这意味着当执行此类代码时,地球上的任何事情都可能发生,并且您不能向这个星球上的任何人投诉。

其他提示

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

第3行绝对是不确定的行为,因为您正在尝试在不在堆上的地址上删除内存。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top