2016-05-17 105 views
0

我有以下代碼:初始化的unique_ptr測試

class foo { 

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

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

} 

.cpp文件:

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

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

現在,在單元測試文件:

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); 

代碼當控件進入setMean函數時打破。

unique_ptr的初始化有問題嗎?

+2

你在哪裏初始化'meanObj'? – 101010

+1

實際上沒有任何foo對象 – lsbbo

+0

爲什麼你甚至需要'unique_ptr'?只要做'foo meanObj; meanObj.setMean(input);' – Kevin

回答

3

的最後兩行的例子中,使用原始指針改寫,將

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

你看這個問題?您正在取消nullptr。你需要的是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>()); 

沒有這一點,你調用的std::unique_ptr默認構造函數,設定指向的底層成員nullptr。因此,你對下一行的尊重是空指針解引用。

4

是的,你在哪裏初始化std::unique_ptr

你不是,這就是爲什麼std::unique_ptr將指向nullptr,你不能尊重它,所以你得到了一個分段錯誤。

std::make_unique初始化:

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

你不設置meanObj點/自己的東西先創建一個foo對象。您需要用foo對象初始化智能指針。

如果你不使用C++ 14,你不希望你的初始化在unique_ptr聲明它同一個地方,你可以做

meanObj.reset(new foo()); 
0

我知道你已經接受一個答案,但從我所看到的你根本不需要使用unique_ptr。只需使用對象本身:

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

我發佈的代碼是簡化版,實際代碼太複雜了。 –