删除指向自动变量的指针[重复
-
30-09-2019 - |
题
这个问题在这里已经有一个答案:
- 堆栈对象的“删除”的行为是什么? [复制 1个答案
请查看此代码
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行绝对是不确定的行为,因为您正在尝试在不在堆上的地址上删除内存。
不隶属于 StackOverflow