2017-05-31 45 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(因爲弱指針不會增加引用計數器),因此堆中的資源將被刪除。

相關問題