2017-07-28 50 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>オブジェクトを作成します。空のベクトルへのポインタは、NULLポインタ(全くベクトルを指していない)とは全く異なります。

+0

私はキーがshared_ptrの適切な初期化であることを見ています。 – Ashutosh

1

スマートポインタHは、がデフォルトで作成されたです。 スマートポインタがデフォルトで作成されるとき、ポインタ値はnullptrです。

したがって、逆参照すると(*HまたはH->)、は未定義の動作になります。

有効な共有ポインタを作成するには、std::make_shared()関数を使用できます。

たとえば:参照によるshared_ptrを渡す

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

(OT) シンプルなアドバイス はおそらく良いアイデアではありません!

+0

あなたはそうです、参照はここで全く必要ではありません! – Ashutosh

1

共有ポインタ(またはスマートポインタ)は、最初はnullptrであるという意味で通常のポインタのように動作し、初期化後に特定のメモリアドレスを指すようになります。 shared_ptrの場合、初期化はmake_shared関数を使って行うのが最善です。これは必要に応じて参照でうまく記述されています。

関連する問題