将std :: shared_ptr << std :: vector >传递给函数

问题描述:

我想了解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

H使用空指针进行初始化,因此解除引用会导致未定义的行为。

您原本是想做到这一点:

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

这将创建由H拥有一个新的空std::vector<double>对象。指向空向量的指针与空指针(根本不指向任何向量)完全不同。

+0

我看到,关键是shared_ptr的正确初始化。 – Ashutosh

你的智能指针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

共享指针(或任何智能指针)的行为就像一个普通的指针,它最初是一个nullptr,初始化后它会开始指向特定的内存地址。在shared_ptr的情况下,initalization最好使用make_shared函数完成,如果需要它可以在引用中很好地描述。