Nih*_*mar -1 c++ shared-ptr boost-smart-ptr c++11
我刚开始学习智能指针,遇到了一个似乎与理论相矛盾的情况。例如,当我们使用 shared_ptr 并且如果调用复制语义时,对象共享所有权并且引用计数为 2。这是可以理解的。例如代码。
class Test {
public:
Test(){ cout << "Const" << "\n"; }
void Disp(){
cout << "Class Test()\n";
}
~Test(){ cout << "Dest" << "\n"; }
};
int main()
{
Test *p = new Test();
shared_ptr<Test> p1(p);
shared_ptr<Test> p2(p1); // = make_shared<Test>(*p1);
p1->Disp();
p2->Disp();
}
Run Code Online (Sandbox Code Playgroud)
输出很好,因为:
Const
Class Test()
Class Test()
Dest
Run Code Online (Sandbox Code Playgroud)
现在,如果我尝试将语义移动为
int main()
{
Test *p = new Test();
shared_ptr<Test> p1(p);
shared_ptr<Test> p2 = make_shared<Test>(*p1);
p1->Disp();
p2->Disp();
}
Run Code Online (Sandbox Code Playgroud)
那么 p1 应该已经失去了所有权。因此 p1->Disp() 应该是有效的。因为 make_shared 将转移所有权并重置 p1。但是我仍然可以调用 p1->Disp() 并且调用了正确的函数。请纠正我的理解。
谢谢。
主要的误解是std::make_shared不移动旧对象的所有权。相反,您正在创建Testnewstd::shared_ptr引用的第二个实例。
如果你真的想转移所有权,你需要明确地这样做,例如:
int main()
{
Test *p = new Test();
shared_ptr<Test> p1(p);
shared_ptr<Test> p2(std::move(p1));
// p1->Disp(); // No longer allowed, as p1 is now "empty"
p2->Disp();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
56 次 |
| 最近记录: |