0

考虑以下程序:

include <iostream>

using namespace std;

int main()
{

    int *ptr = new int(10);
    int &ref = *ptr;

    cout << ref << endl << &ref << endl;

    delete ptr;
    ptr = new int(100);
    cout << ref << endl << &ref << endl;

    return 0;
}

输出:
10
0x80010348
100
0x80010348

这里的ref变量是对指向的内存位置的引用ptr。但是,当ptr删除指针并分配新的内存位置时,ref现在应该引用未定义的内存位置,因为以前的内存位置不存在。但是当我运行这个程序时,我通过 ref 和 cygwin/linux 上的 g++ 以及 VC++2012 express 获得了更新的值和地址。

但是,如果 ptr没有被删除,则ref不会更新,并且输出显示旧值 10 和旧地址。这是行为标准还是特定于编译器?如果它是标准的,那么为什么更新ref取决于是否ptr被删除?

4

1 回答 1

2

这只是内存分配器的工作方式。在您的代码中:

delete ptr;
ptr = new int(100);

你删除了一个int,然后你立即要求一个新的。运行时说“好的,有这个。它刚刚可用”。

简单回收。

于 2013-04-02T11:29:40.080 回答