微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

shared_ptr 的移动语义

如何解决shared_ptr 的移动语义

我刚开始学习智能指针,遇到了一个似乎与理论相矛盾的情况。 例如当我们使用 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();

}

输出很好:

Const
Class test()
Class test()
Dest

现在,如果我尝试将语义移动为

int main()
{
 Test *p = new test();
 shared_ptr<Test> p1(p);
 shared_ptr<Test> p2 = make_shared<Test>(*p1);

 p1->disp();
 p2->disp();

}

那么p1应该已经失去了所有权。因此 p1->disp() 应该是有效的。因为 make_shared 将转移所有权并重置 p1。但是我仍然可以调用 p1->disp() 并且调用了正确的函数。 请纠正我的理解。

谢谢。

解决方法

主要的误解是 std::make_shared 不会移动旧对象的所有权。相反,您正在创建新的 Test 所指的 std::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();
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。