我试图了解shared_ptrs的用法。
下面的简单代码#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;
}
给了我一个我无法理解的分段错误。我在这里做错了什么?
答案 0 :(得分:4)
H
,因此取消引用它会导致未定义的行为。
你或许打算这样做:
auto H = std::make_shared<std::vector<double>>();
这将创建std::vector<double>
拥有的新的空H
对象。指向空向量的指针与空指针(指向根本没有向量)完全不同。
答案 1 :(得分:1)
您的智能指针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
可能不是一个好主意!
答案 2 :(得分:1)
共享指针(或任何智能指针)的行为类似于常规指针,因为它最初是一个nullptr,并且在初始化之后它将开始指向特定的内存地址。在shared_ptr的情况下,最好使用make_shared函数完成初始化,如果需要,可以在引用中很好地描述。