将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;
}
给我一个分段错误,我似乎无法理解。我在这里做错了什么?
H
使用空指针进行初始化,因此解除引用会导致未定义的行为。
您原本是想做到这一点:
auto H = std::make_shared<std::vector<double>>();
这将创建由H
拥有一个新的空std::vector<double>
对象。指向空向量的指针与空指针(根本不指向任何向量)完全不同。
我看到,关键是shared_ptr的正确初始化。 – Ashutosh
你的智能指针H
是默认创建的。 智能指针默认创建时,其指针值为nullptr
。
因此,当您解除引用时(*H
或H->
),您将导致未定义的行为。
为了创建一个有效的共享指针,您可以使用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
引用可能不是一个好主意!
你是对的,这里根本就不需要参考! – Ashutosh
共享指针(或任何智能指针)的行为就像一个普通的指针,它最初是一个nullptr,初始化后它会开始指向特定的内存地址。在shared_ptr的情况下,initalization最好使用make_shared函数完成,如果需要它可以在引用中很好地描述。
您需要初始化'std :: shared_ptr'。默认情况下,它是一个'nullptr'。所以你需要做'H = std :: make_shared>()'。你可以像下面这样将声明和初始化结合起来:'auto H = std :: make_shared >()' –
Justin
[OT]因为你不转让所有权,所以最好使用'void funct(std :: vector&H)'和'funct(* H);'。 –
Jarod42