传递std :: shared_ptr&lt; <std :: vector <double>&gt;一个功能

时间:2017-07-28 22:53:31

标签: c++ c++11

我试图了解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;
}

给了我一个我无法理解的分段错误。我在这里做错了什么?

3 个答案:

答案 0 :(得分:4)

使用空指针初始化

H,因此取消引用它会导致未定义的行为。

你或许打算这样做:

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

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

答案 1 :(得分: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可能不是一个好主意!

答案 2 :(得分:1)

共享指针(或任何智能指针)的行为类似于常规指针,因为它最初是一个nullptr,并且在初始化之后它将开始指向特定的内存地址。在shared_ptr的情况下,最好使用make_shared函数完成初始化,如果需要,可以在引用中很好地描述。