如今,通过series of SO questions变得很明显,我对指针,引用和值的真实本质只有很少的了解。

考虑以下代码:

int* p = new int(3);
int& r = *p;

cout << " p = " << p << "\t*p = " << *p << endl;
cout << "&r = " << &r << "\t r = " << r << endl;

delete p;

cout << "&r = " << &r << "\t r = " << r << endl;

int v = 4;
r = v;

cout << "&r = " << &r << "\t r = " << r << endl;

的输出是
 p = 0x1001000b0    *p = 3
&r = 0x1001000b0     r = 3
&r = 0x1001000b0     r = 3
&r = 0x1001000b0     r = 4

我不明白的是,为什么第二次我打印引用的值时不会出错。与引用值对应的指针已被删除。从我的previous question中,我几乎使自己确信,诸如r = x之类的任何语句都将x的拷贝替换为r所引用的值。但是,如果是这种情况,那么p&r将是不同的地址,对吗?如果我已经在0x100100b0上调用了delete,那么如何继续使用它?

是或否:引用与地址值的别名相同。

是或否:如果您删除一个指向与引用值相同的地址的指针(如上所述),则不会发生未定义的行为,并且只要引用存在,就不会覆盖该地址。

最佳答案

即使没有错误,结果仍然是不确定的。未定义的行为意味着任何事情都可能发生,包括您的程序似乎可以继续正常运行。



这是正确的。说引用是对象的别名(而不是值)会更正确。



这也是事实。在尝试使用引用之前,没有定义的行为。当您尝试使用引用时(例如,通过&r),您将获得未定义的行为。

如果销毁对象后从未尝试使用引用,则不会有未定义的行为。



不,这是不正确的。一旦对象被销毁,对其的任何引用或指针都是无效且不可用的。如果您尝试使用指针或对销毁对象的引用,则结果是不确定的。

关于c++ - 了解引用与指针。为什么这样做?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4390945/

10-11 22:37
查看更多