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。

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

4

3 回答 3

5

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

在未使用 new 动态分配的指针上调用 delete 称为Undefined Behavior。简而言之,这意味着当执行这样的代码时,地球上的任何事情都可能发生,你不能向这个星球上的任何人抱怨。

于 2010-12-03T09:05:28.537 回答
1

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

于 2010-12-03T09:01:59.470 回答
0

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

于 2010-12-03T09:02:25.287 回答