2017-05-31 66 views
3

我使用std::weak_ptrstd::make_shared时偶然发现这种行为,我觉得这一点都不奇怪。我正在使用C++ 11。的std :: weak_ptr的分配使用的std :: make_shared

#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打印好,第二个给我一个段错误。我试图寻找在std::weak_ptrstd::shared_ptrcppreference的页面,但我还是不明白为什么会这样。不得不创建一个临时对象让我觉得很麻烦,这是在C++ 14中解决的问题,还是我没有看到的东西?

谢谢!

回答

5

只有在指向相同基础对象的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(因为弱指针不会增加引用计数器),因此堆中的资源将被删除。