2016-05-17 7 views
0

をテスト:は、ユニットにunique_ptrを初期化し、私は次のコードを持っている

std::shared_ptr<std::valarray<double>> input = std::make_shared<std::valarray<double>>(std::initializer_list<double>{0.0, 0.0}); 

std::unique_ptr<foo> meanObj; 

meanObj->setMean(input); 

コード:ユニットテストファイルで、今

foo::foo() : mean(nullptr) { 
} 

void foo::setMean(std::shared_ptr<std::valarray<double>> input){ 
    mean = input; 
} 

class foo { 

    public: 
     foo(); 
     void setMean(std::shared_ptr<std::valarray<double>> input); 
    private: 

     std::shared_ptr<std::valarray<double>> mean; 

} 

.cppファイルを制御がsetMeanの機能の中に入るときに壊れます。

unique_ptrの初期化に問題がありますか?

+2

「meanObj」はどこで初期化しますか? – 101010

+1

どこにも実際にfooオブジェクトがありません – lsbbo

+0

なぜあなたは 'unique_ptr'を必要としますか?ちょうど 'foo meanObj;を実行してください。 meanObj.setMean(入力); ' – Kevin

答えて

3

最後の2行、生のポインタを使用して書き換え、あなたが問題を参照してください

foo* meanObj = nullptr; 
meanObj->setMean(input); 

でしょうか? nullptrを参照外にしています。あなたは/自分の何かを指すようにmeanObjを設定していないあなたが最初unique_ptr

auto meanObj(std::make_unique<foo>()); 
// or std::unique_ptr<foo> meanObj(new foo); 
meanObj->setMean(input); 
+0

答えをありがとう。何らかの理由で 'std :: make_unique'を使うことはできません。しかし、代わりのアプローチを使用して、それは動作します。 –

+1

@chintans 'make_unique'がC++ 14で追加されたので、そのバージョンをサポートするstdlibの実装が必要です。 – Praetorian

2

はいあります。あなたはこのように、実際のオブジェクトでそれを初期化する必要があります。

std::unique_ptr<foo> meanObj(std::make_unique<foo>()); 

これがなければ、あなたは尖った-にnullptrにメンバーを根底を設定std::unique_ptrのデフォルトコンストラクタを呼び出しています。したがって、次の行でのあなたの服従は、ヌルポインタの逆参照です。

4

はい、どこにstd::unique_ptrを初期化していますか?

あなたはそうではないので、std::unique_ptrnullptrを指しますので、それを尊重することはできませんので、セグメンテーション違反が発生しています。

std::make_uniqueでそれを初期化します。あなたの例の

std::unique_ptr<foo> meanObj = std::make_unique<foo>(); 
0

を管理するfooオブジェクトを作成する必要があります。スマートポインタをfooオブジェクトで初期化する必要があります。

場合、あなたはC++ 14を使用していない、あなたは、あなたが私はあなたが既に答えを受け入れ知っ

meanObj.reset(new foo()); 
0

を行うことができますあなたはそれを宣言し、同じ場所にunique_ptrを初期化する必要はありませんしかし、私が見ることから、unique_ptrをまったく使用する必要はありません。

foo meanObj; 
meanObj.setMean(input); 
+0

私が掲載したコードは、バージョンを下げたものです。実際のコードはあまりにも複雑です。 –

関連する問題