使用std::make_shared进行std::weak_ptr赋值

3

我在使用 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是否已经解决了这个问题,还是有什么我没有看到的东西?
谢谢!
2个回答

5
weak_ptr只有在锁定后,如果仍存在指向相同底层对象的shared_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指向相同的底层对象时才有效。这就是它的目的

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


4

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

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

在赋值操作符结束后,临时共享指针被析构,引用计数达到0(因为弱指针不增加引用计数),从而删除堆上的资源。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接