gpt4 book ai didi

c++ - 了解引用与指针。为什么这行得通?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:12:02 25 4
gpt4 key购买 nike

通过 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

我不明白的是为什么我第二次打印引用的值时没有出错。与引用值对应的指针已被删除。来 self 的 previous question ,我几乎说服自己,任何像 r = x 这样的语句都会复制 x 来代替 r 所指的值.但是,如果是这种情况,那么 p&r 将是不同的地址,对吧?如果我已经在 0x100100b0 上调用了 delete,那么我该如何继续使用它?

判断对错:引用与地址值的别名相同。

判断对错:如果您删除指向与引用值所在地址相同的指针(如我上面所做的),则不会发生未定义的行为,并且只要引用存在。

最佳答案

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

A reference is the same thing as an alias to the value at an address.

这实际上是正确的。更正确的说法是引用是对象(不是值)的别名。

If you delete a pointer to the same address as a referenced value resides, (as I do above), then no undefined behavior will occur,

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

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

no one will ever overwrite that address as long as the reference exists.

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com