如今,通过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/