【问题标题】:Pointer to deallocated location Is it a Undefined Behavior?指向已释放位置的指针是未定义的行为吗?
【发布时间】:2012-05-19 05:30:08
【问题描述】:

指向已释放位置的指针是未定义的行为吗?

http://ideone.com/Qp3uY

int *p = new int;

*p = 10;

delete p;

*p = 10;

cout << *p << endl;

【问题讨论】:

  • 是的。下一个问题?
  • 当我在字典中查找Undefined 这个词时,我看不到“崩溃”的任何含义......
  • 为什么这不是一个真正的问题!我真的不知道它是否是UB ...我们的讲座告诉我们它不是UB ....

标签: c++ pointers undefined-behavior


【解决方案1】:

仅仅存在指向已释放位置的指针本身并不是未定义的行为。尝试取消引用该指针确实会产生未定义的行为。

【讨论】:

    【解决方案2】:

    取消引用已删除的指针是未定义的操作。不要这样做。

    【讨论】:

    • 可能不再有be位置 - 操作系统可能会从您的虚拟内存空间中删除该地址。
    【解决方案3】:

    这是未定义的行为:

    如果标准库中的释放函数的参数是一个非空指针值的指针,则释放函数将释放指针引用的存储空间,使所有引用 释放的存储空间。使用无效指针值(包括将其传递给释放函数)的效果是未定义的。 - C++ '03 3.7.3.2

    【讨论】:

      【解决方案4】:

      当你分配内存来创建一个新指针时,就像你在第一行中所做的那样

      int *p = new int;
      

      您要求操作系统生成一些内存供您使用,只要您愿意。然后你可以在那个地方放一些东西,就像你做的那样

      *p = 10;
      

      此内存可供您根据需要使用,然后您可以通过调用delete 告诉操作系统您已使用它,就像您在下一行中所做的那样。

      delete p;
      

      操作系统现在有可用的内存,但它可能会也可能不会对这些内存做些什么。如果你分配了一堆其他的内存,那么新的内存范围可能包含这个内存。可能。操作系统可能会将这个内存交给其他东西,也可能不会 - 它不会告诉你,这就是为什么说仍然使用内存中的那个位置是未定义的行为。 p>

      *p = 10;
      

      然后您重新使用这个内存位置,再次将其设置为 10。在此期间没有发生任何其他事情,这是一个相当琐碎的程序,因此操作系统尚未对该内存块进行任何其他操作,因此在这种情况下设置它不会产生更大的效果。

      cout << *p << endl;
      

      同样,操作系统现在拥有内存,但此时它不太可能对它做任何事情;这就像在您的住宿正式结束后住在酒店房间一样。您可能会也可能不会呆在那里,因为您不知道房间之后是否正在被其他人使用,或者它是否仍然是空的。你可能会被赶出去,也可能是安全的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-12
        • 1970-01-01
        • 1970-01-01
        • 2012-12-28
        • 1970-01-01
        • 2014-06-22
        相关资源
        最近更新 更多