【发布时间】:2021-11-10 16:50:49
【问题描述】:
这是程序运行的图像:
为什么,当我删除一个指向内存位置的指针时,我可以更改另一个指针中的值而不会出错?为什么删除指针的地址会改变?我在互联网上读到地址在删除后不应该改变。是否依赖于编译器?
int* ptr = new int(7);
int* _ptr = ptr;
cout << ptr << '\n'; //print - 00CE4ED0
delete ptr;
cout << ptr << '\n'; //print - 00008123
cout << *_ptr << '\n'; //in this moment cout<<*_ptr; give garbage insdead of error . WHY?!
*_ptr = 10;
cout << *_ptr << '\n'; //print 10
【问题讨论】:
-
delete不会破坏指针。它破坏了指针指向的对象。在delete ptr;之后,ptr和_ptr都指向一个您不再被允许使用的已破坏对象。 -
你是如何断定地址改变的?您只是在取消引用指针,而不是查看指针本身的值
-
我认为您的意思是“价值”而不是地址。在删除指针指向的数据后访问指针的值是“未定义的行为”,应该不惜一切代价避免。考虑使用 std::unique_pointer 或 std::shared_pointer(假设你没有在大学学习 C++)
-
弗朗索瓦说得对。一旦 *ptr(与 *_ptr 相同)被 delete ptr 销毁,就不能再访问它。另一点:由于 ptr 是一个数组,你的意思是 delete [] ptr 不是 delete ptr.