int*a=nullptr; //NULL before C++11
a=new int(1);
delete a;
a
现在指向什么?它是指向nullptr
还是指向它在删除之前指向的地址?
答案 0 :(得分:6)
根据C ++标准(6.7存储持续时间)
4当达到存储区域的持续时间结束时, 所有指针的值,表示其任何部分的地址 存储区域成为无效指针值(6.9.2)。 间接通过无效指针值并传递无效 指向释放函数的指针值具有未定义的行为。任何 其他使用无效指针值具有实现定义 行为。
所以在这个表达式声明之后
delete a;
指针a
的值未更改,但已变为无效。这个地址都不存在任何对象。
答案 1 :(得分:5)
不要将指针的值与指向的值混淆。删除后,指针的值不变。它没有设置为nullptr
或类似的东西。它指向到的东西是未定义的。总而言之,它最终指向它之前所做的事情,这会导致各种有趣的错误。
答案 2 :(得分:4)
其他一些答案错误地说“值不会改变”。但它确实如此:在删除之前它是有效的,并且在删除之后它是无效的;这是一个改变。
此外,值的表示也可能会改变。例如,实现可以将a
设置为null,或调试器将识别的某种模式,以帮助检测变量的无效使用。
答案 3 :(得分:3)
它没有指向任何东西。现在你的价值没有用。