为什么这个例子在指针上"bad!"?

Why is this example on pointers "bad!"?

本文关键字:bad 指针 为什么      更新时间:2023-10-16

我正在阅读《学习一门新的编程语言:面向Java程序员的c++》,这里有一个关于指针的例子:

永远不要解引用悬空指针(指向另一个已删除指针所指向的位置的指针):

  int *p, *q;
  p = new int;
  q = p;           // p and q point to the same location
  delete q;        // now p is a dangling pointer
  *p = 3;          // bad!

但是,如果我将此代码复制到main函数中并添加以下cout:

  cout << p << " " << *p << endl;

我得到了输出:

  0000022DC3DD0EF0 3

这对我来说似乎是有效的,我得到了指针,然后解值。

这是网页上的错别字,还是上面的代码不好?

这是未定义的行为。不能通过已删除的指针访问内存。

当你删除对象时,它的内存被标记为空闲,可以被其他对象使用,甚至返回给操作系统。但是没有人会因为从内存中删除对象而浪费CPU。所以p还在,但不再是你的了。你不能确定在那个地方存储了什么,甚至你仍然有权读取内存。

你的例子很简单,所以它的行为是可预测的。当在删除对象和访问其内存之间有很多工作要做时,事情就变得奇怪了。更糟糕的是,这些bug是浮动的,代码有时能正常工作,有时不能。所以它们很难调试

这对我来说似乎是有效的,我得到了指针,然后解值。

"未定义行为"允许的行为之一是产生让你认为一切都很好的结果。(然后停止在一个更复杂的程序中工作,因为您认为这不可能是问题)