C++ C++;-是否允许编译器回收已删除的指针变量?

C++ C++;-是否允许编译器回收已删除的指针变量?,c++,pointers,compiler-optimization,delete-operator,C++,Pointers,Compiler Optimization,Delete Operator,我的问题与此完全相似: 但是在C++的情况下, 对于C,第6.2.4条第2款规定: 对象的生存期是程序执行期间保证为其保留存储的部分。对象存在,具有恒定地址,并在其整个生命周期中保留其最后存储的值。如果对象在其生存期之外被引用,则该行为未定义指针指向的对象到达其生命周期结束时,指针的值变得不确定 但是,看最新的C++标准,我找不到任何关于这个问题的明确答案。 我目前的理解是,在C++中,虽然指针被删除的内存位置确实是无效的,但是指针本身的值是不允许改变的,除非程序员指示程序这样做。 有人能给我

我的问题与此完全相似:

但是在C++的情况下,

对于C,第6.2.4条第2款规定:

对象的生存期是程序执行期间保证为其保留存储的部分。对象存在,具有恒定地址,并在其整个生命周期中保留其最后存储的值。如果对象在其生存期之外被引用,则该行为未定义指针指向的对象到达其生命周期结束时,指针的值变得不确定

但是,看最新的C++标准,我找不到任何关于这个问题的明确答案。

我目前的理解是,在C++中,虽然指针被删除的内存位置确实是无效的,但是指针本身的值是不允许改变的,除非程序员指示程序这样做。 有人能给我指一些能给这个问题带来明确答案的参考资料吗?

如果我们有:

int * a = new int;
int * b = a;
delete a;
std::cout<< (a==b) << "\n";
int*a=新的int;
int*b=a;
删除一条;

std::cout“指针的值”只是一个数字。内存地址。当然,地址可以重复使用。指针变量保存地址,正如您所说,删除对象后地址不会更改,因此编译器无法“回收”它。然而,根据内存分配器的不同,指向的内存可能会被“回收”(但编译器与此无关),实际上您是对的。实际上,我在发布这个问题时错过了这个线索。@OlivierSohn不正确;删除对象后,指向该对象的所有指针都将变为invalid@M.M保存对象内存地址的指针变量的值在删除对象后不会更改。它现在指向一个已被删除的无效对象,但它指向的内存位置与以前相同。所以你说我的注释不正确是错误的:)使用无效指针值,而不是间接通过它或尝试取消分配它(再次?),特别是从左值到右值的转换,是实现定义的行为。[basic.stc]/4[conv.lval]/(3.3)。所以它可能和ub一样坏,但是它们必须告诉我们。在C++中,删除的指针取无效的指针值,而不是不确定的值。(C++17[basic.stc]/4)。比较导致实现定义的行为,而不是UB(同上)