2017-07-28 173 views
0

我想了解shared_ptrs的用法。下面的簡單代碼將std :: shared_ptr << std :: vector <double>>傳遞給函數

#include<iostream> 
#include<vector> 
#include<memory> 

void funct(std::shared_ptr<std::vector<double>> H){ 
    H->push_back(1.00); 
} 

int main() 
{ 
std::shared_ptr<std::vector<double>> H; 
funct(H); 
return 0; 
} 

給我一個分段錯誤,我似乎無法理解。我在這裏做錯了什麼?

+2

您需要初始化'std :: shared_ptr'。默認情況下,它是一個'nullptr'。所以你需要做'H = std :: make_shared >()'。你可以像下面這樣將聲明和初始化結合起來:'auto H = std :: make_shared >()' – Justin

+3

[OT]因爲你不轉讓所有權,所以最好使用'void funct(std :: vector &H)'和'funct(* H);'。 – Jarod42

回答

4

H使用空指針進行初始化,因此解除引用會導致未定義的行爲。

您原本是想做到這一點:

auto H = std::make_shared<std::vector<double>>(); 

這將創建由H擁有一個新的空std::vector<double>對象。指向空向量的指針與空指針(根本不指向任何向量)完全不同。

+0

我看到,關鍵是shared_ptr的正確初始化。 – Ashutosh

1

你的智能指針H默認創建的。 智能指針默認創建時,其指針值爲nullptr

因此,當您解除引用時(*HH->),您將導致未定義的行爲

爲了創建一個有效的共享指針,您可以使用std::make_shared()函數。

例如:

int main() { 
    auto H = std::make_shared<std::vector<double>>(); 
    // Now H is not a nullptr pointer. 
    funct(H); 
    return 0; 
} 

(OT) 簡單的建議 傳遞一個shared_ptr引用可能不是一個好主意!

+0

你是對的,這裏根本就不需要參考! – Ashutosh

1

共享指針(或任何智能指針)的行爲就像一個普通的指針,它最初是一個nullptr,初始化後它會開始指向特定的內存地址。在shared_ptr的情況下,initalization最好使用make_shared函數完成,如果需要它可以在引用中很好地描述。

相關問題