JnB*_*ymn 6 c++ pointers reference
通过今天的一系列SO问题我已经明白,我对指针,引用和值的真实性质只有很少的理解.
请考虑以下代码:
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;
Run Code Online (Sandbox Code Playgroud)
这个输出是
p = 0x1001000b0 *p = 3
&r = 0x1001000b0 r = 3
&r = 0x1001000b0 r = 3
&r = 0x1001000b0 r = 4
Run Code Online (Sandbox Code Playgroud)
我不明白的是为什么我第二次打印引用的值时我没有收到错误.与参考值对应的指针已被删除.从我之前的问题来看,我几乎已经说服自己,任何声明都r = x可以x代替所涉及的价值r.但是,如果是这种情况那么p,那&r将是不同的地址,对吗?如果我已经在0x100100b0上调用了delete,那么我该如何继续使用它呢?
对或错:引用与地址值的别名相同.
正确或错误:如果删除指向与引用值相同的地址的指针(如上所述),则不会发生任何未定义的行为,只要引用存在,就不会覆盖该地址.
Jam*_*lis 11
即使您没有收到错误,结果仍然是未定义的.未定义的行为意味着任何事情都可能发生,包括您的程序似乎继续正常工作.
引用与地址值的别名相同.
这实际上是正确的.说引用是对象的别名(而不是值)会更正确.
如果删除指向与引用值相同的地址的指针(如上所述),则不会发生未定义的行为,
这也是事实.在尝试使用引用之前,没有已定义的行为.当您尝试使用引用(例如,via &r)时,您将获得未定义的行为.
如果在销毁对象后从未尝试使用引用,则没有未定义的行为.
只要引用存在,任何人都不会覆盖该地址.
不,这不正确.一旦对象被销毁,任何引用或指针都无效且无法使用.如果尝试使用指针或对已销毁对象的引用,则结果是未定义的.