【问题标题】:Problem with deleting one of two pointers that point at the same memory location删除指向同一内存位置的两个指针之一的问题
【发布时间】: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.

标签: c++ c++17


【解决方案1】:

我可以无误地更改另一个值吗?

您有未定义的行为,因为您在此处取消引用指向已删除对象的指针。

cout<<*_ptr; 

C++ 不会在您执行未定义行为时向您保证错误。相反,任何事情都可能发生。

【讨论】:

  • 谢谢,我理解这一点,但我不知道为什么删除 ptr 后我可以这样做(*_ptr=10)并且这有效?!我显然做不到 (*ptr=10)。请查看我在说明中添加的屏幕截图。
  • @YuraPazyn 你是如何决定“显然不能做 (*ptr=10)”的? You can。再一次,它被称为Undefined Behavior
  • 我是否正确理解未定义的行为处理可能会有所不同,并且取决于编译器,有些编译器会给出错误,而其他不是?
  • @YuraPazyn 一般来说,未定义的行为没有被“处理”。这就是它未定义的原因。
  • 是的,Yura,这是正确的理解。它确实取决于编译器(至少)。所以最好避免。
猜你喜欢
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-27
  • 1970-01-01
相关资源
最近更新 更多