boost :: shared_ptr问题.为什么这样做?

JnB*_*ymn 3 c++ pointers reference shared-ptr

在试验这个问题时,我创造了一个我完全不理解的例子.特别是,它突出了我对指针,引用和boost :: shared_ptr的误解.

int& r = *(new int(0));//gratuitous pointer leak, got to initialize it to something
{
    boost::shared_ptr<int> sp(new int(100));
    r = *sp;
    cout << "r=" << r << endl;
}
cout << "r=" << r << endl << endl;

int* p;
{
    boost::shared_ptr<int> sp(new int(100));
    p = &*sp;
    cout << "*p=" << *p << endl;
}
cout << "*p=" << *p << endl;
Run Code Online (Sandbox Code Playgroud)

运行此代码会得到如下输出:

r=100
r=100

*p=100
*p=13
Run Code Online (Sandbox Code Playgroud)

为什么引用在shared_ptr的死亡中存活但指针不存在?


这里的答案存在一个问题,即似乎存在两种截然相反且相互矛盾的解决方案,而且没有就真理达成共识.我希望能够在删除shared_ptr后使用引用,但如果它无效,我真的需要理解这一点.

也许有人可以发布一个简单的例子来演示引用中未定义的行为.

fre*_*low 12

因为r = *sp;没有做你认为它做的事情.它分配给引用对象,即int在第1行中在堆上创建的匿名对象.您无法在C++中重新引用引用.

以下是标准关于评估引用表达式的内容:

如果表达式最初具有"引用T"类型,则T在进行任何进一步分析之前调整类型. 表达式指定由引用表示的对象或函数,表达式是左值或x值,具体取决于表达式.

所以你看,没有办法得到"引用本身".它在C++中根本就不存在.

也许这段代码会更清晰:

int a = 42;
int b = 97;

int&r = a;   // r is just an alias (another name) for a
    r = b;   // assigns b to a (does NOT bind r to b, that's impossible in C++!)
Run Code Online (Sandbox Code Playgroud)

执行最后一行后,双方ab含有97,因为r = b真正的意思a = b.