删除的指针指向什么?

Joh*_*oss 6 c++ c++11

int*a=nullptr; //NULL before C++11
a=new int(1);
delete a;
Run Code Online (Sandbox Code Playgroud)

a现在指向什么?是否指向nullptr或指向它被删除之前指向的地址?

Vla*_*cow 5

根据C++标准(6.7存储持续时间)

4当达到存储区域的持续时间结束时,表示该存储区域的任何部分的地址的所有指针的值变为无效指针值(6.9.2).通过无效指针值间接并将无效指针值传递给释放函数具有未定义的行为.无效指针值的任何其他使用都具有实现定义的行为.

所以在这个表达式声明后

delete a;
Run Code Online (Sandbox Code Playgroud)

指针的值a不会更改,但已变为无效.这个地址都不存在任何对象.

  • "指针a的值不会改变".这不是那个片段所说的.它描述了什么是未定义的,然后声明其他所有内容都是*实现定义的*.这包括读取指针的值.例如,编译器将所有已删除指针的值更改为nullptr是完全合规的. (5认同)

M.M*_*M.M 5

其他一些答案错误地指出“值不变”。但是确实如此:删除之前它是有效的,删除之后它是无效的;这是一个变化。

此外,值的表示也可能会更改。例如,实现可以设置a为null,或者调试器将识别出的某种模式,以帮助检测变量的无效使用。