【问题标题】:std::weak_ptr assignment with std::make_sharedstd::weak_ptr 分配与 std::make_shared
【发布时间】:2017-05-31 10:56:51
【问题描述】:

我在使用 std::weak_ptrstd::make_shared 时偶然发现了这种行为,我发现它有点奇怪。我正在使用 C++11。

#include <iostream>
#include <memory>

int main()
{
  std::weak_ptr<int> weak;

  std::shared_ptr<int> shared {std::make_shared<int>(42)};
  weak = shared;
  std::cout << "Meaning of life: " << *weak.lock() << std::endl;

  weak = std::make_shared<int>(23);
  std::cout << "Meaning of life: " << *weak.lock() << std::endl;

  return 0;
}

第一个std::cout 打印正常,第二个给我一个段错误。我尝试在cppreference 上查看std::weak_ptrstd::shared_ptr 的页面,但我仍然不明白为什么会发生这种情况。必须创建一个临时对象让我觉得很麻烦,这是在 C++14 中已经解决的问题还是我没有看到的东西?

谢谢!

【问题讨论】:

    标签: c++11 weak-ptr make-shared


    【解决方案1】:

    如果shared_ptr 对象仍然存在并且指向同一个底层对象,则只能在锁定后取消引用weak_ptr

    在你的第一部分

    std::shared_ptr<int> shared {std::make_shared<int>(42)};
    weak = shared;
    std::cout << "Meaning of life: " << *weak.lock() << std::endl;
    

    确实如此。在第二部分

    weak = std::make_shared<int>(23);
    std::cout << "Meaning of life: " << *weak.lock() << std::endl;
    

    事实并非如此,因为shared_ptr 是一个临时对象。

    您在这里遇到的正是 weak_ptr 的构建目的 - 只要其他一些 shared_ptr 指向同一个底层对象,它就有效。那是its purpose:

    std::weak_ptr 是一个智能指针,它持有对 std::shared_ptr 管理的对象的非拥有(“弱”)引用...如果此时原始 std::shared_ptr 被销毁,对象的生命周期被延长,直到临时 std::shared_ptr 也被销毁。

    【讨论】:

      【解决方案2】:

      这是因为你在这一行中创建了一个临时共享指针并立即将它分配给一个弱指针:

      weak = std::make_shared<int>(23);
      

      赋值运算符结束后,临时共享指针被销毁,引用计数为0(因为弱指针不增加引用计数),因此堆上的资源被删除。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-17
        • 1970-01-01
        • 1970-01-01
        • 2014-08-10
        • 1970-01-01
        • 2021-06-05
        • 2016-07-31
        相关资源
        最近更新 更多