在下面 C++ 代码中,由于删除了变量 ptr,因此 ptr 所对应的数据也随之删除,故第 8 行代码被执行时,将报错。( )
int * ptr = new int(10);
cout << *ptr << endl;
delete ptr;
cout << *ptr << endl; // 第 8 行这题考的是 delete 只释放内存不置空指针,导致悬空指针解引用属于未定义行为,不能断定必然报错。
学生最容易误以为 delete 会把指针自动置成 nullptr,或者把未定义行为当成一定会崩溃。其实 delete 后指针仍存原地址,解引用是未定义行为,可能正常输出、可能崩溃、也可能其他诡异结果,所以‘将报错’这种绝对化表述是错的。
【考点】指针基础|动态内存管理|内存生命周期|空指针与悬空指针|未定义行为
GESP 六级《算法与程序设计》指针专项,命题人用这个题卡住的是「delete 操作语义」与「指针生命周期」的混淆。绝大多数考生误以为 delete 会同时置空指针,其实它只释放内存,指针仍保留原地址,由此产生悬空指针。题目把这种未定义行为说成「将报错」,是典型的绝对化陷阱。