ant*_*ert 3 weak-ptr make-shared c++11
我偶然发现了这种行为当使用std::weak_ptr和std::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_ptr在cppreference,但我还是不明白为什么会这样.必须创建一个临时对象对我来说感觉很麻烦,这是在C++ 14中解决的问题还是我没有看到的东西?
谢谢!
在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也被销毁.