【问题标题】:Why does reference pointing to freed memory work?为什么指向已释放内存的引用有效?
【发布时间】:2013-02-16 15:39:46
【问题描述】:

我尝试了下面的 C++ 代码

#include <iostream>
using namespace std;

int main()
{
    int *p = new int;
    *p = 10;
    int &a = *p;
    delete p;
    a = 20;
    cout<<a<<" ";
    cout<<*p;
    return 0;
}

得到的输出为:20 20

我认为这可能会由于访问已释放的内存或一些垃圾而导致运行时错误。可能我得到了这个输出,因为程序释放的内存位置可能还没有被使用,所以仍然保留旧值。

所以我认为如果我不使用引用也应该发生这种情况

#include <iostream>
using namespace std;

int main()
{
    int *p = new int;
    *p = 10;
//  int &a = *p;
    delete p;
//  a = 20;
//  cout<<a;
    cout<<*p;
    return 0;
}

但在这种情况下,我得到的输出为 0(通过多次运行检查)。 Reference 是否与不同的输出有关?

编译器:gcc 版本 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1)

【问题讨论】:

  • 这是未定义的行为。
  • 它似乎工作,就是这样。你违反了规则。
  • 好的,没有将第一组输出设为 20 的参考连接。

标签: c++


【解决方案1】:

您正在取消引用已释放的内存。这是未定义的行为。无法保证结果会是什么。碰巧结合编译器、操作系统和 C++ 库,程序似乎可以工作。

这是未定义行为的一种可能结果。

【讨论】:

    【解决方案2】:

    取消引用delete-d 内存是未定义的行为,没有必要弄清楚一些模式,因为切换到另一个编译器或同一编译的另一个版本可能会破坏它.

    delete 调用非原始类型的析构函数。如果你有一个 class Integer 包装器,它在销毁时清除内容,你会看到一些不同。在 primitive 类型上,delete 不会重新初始化释放的空间。因此,您可能会看到保留了原始值,但这不能保证完全有效,您永远不应该依赖它。

    【讨论】:

      猜你喜欢
      • 2012-12-28
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      • 1970-01-01
      • 2018-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多