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

ant*_*ert 3 weak-ptr make-shared c++11

我偶然发现了这种行为当使用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;
}
Run Code Online (Sandbox Code Playgroud)

第一次std::cout打印很好,第二次给我一个段错误.我试着看的网页std::weak_ptr,并std::shared_ptrcppreference,但我还是不明白为什么会这样.必须创建一个临时对象对我来说感觉很麻烦,这是在C++ 14中解决的问题还是我没有看到的东西?

谢谢!

Ami*_*ory 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;
Run Code Online (Sandbox Code Playgroud)

确实如此.在第二部分

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

情况并非如此,因为它shared_ptr是一个临时对象.

你在这里遇到的正是为什么weak_ptr构建的 - 它只有一些其他shared_ptr指向同一个底层对象才有效.这是它的目的:

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