为什么指针上的这个例子“糟糕!”?

时间:2016-10-16 20:55:54

标签: c++ pointers

我在这里阅读Learning a New Programming Language: C++ for Java Programmers,并且有一个关于指针的示例:

  

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

  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!

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

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

我得到了输出:

  0000022DC3DD0EF0 3

这似乎对我有用,我得到指针然后是deref'd值。

这是网页上的拼写错误,还是以上代码不好的做法?

3 个答案:

答案 0 :(得分:0)

这是未定义的行为。您无法通过已删除的指针访问内存。这是巧合。

答案 1 :(得分:0)

删除对象时,它的内存被标记为空闲,可以被其他对象使用,甚至可以返回给操作系统。但是没有人浪费CPU来擦除内存中的对象。所以p仍然存在,但它不再是你的了。您无法确定该地方存储的内容,甚至您仍然有权阅读内存。

您的示例非常简单,因此它的行为是可预测的。当移除对象和访问它的内存之间做了很多工作时,事情变得奇怪了。更糟糕的是,这样的错误是浮动的,有时代码工作正常,有时则不然。所以他们很难调试。

答案 2 :(得分:0)

  

这对我来说似乎有效,我得到了指针,然后是deref&#39; d。

术语允许的行为&#34;未定义的行为&#34;是产生的结果,让你觉得一切都很好。 (然后停止在更复杂的程序中工作,给你带来很多悲伤,因为你认为这可能是问题所在)