2016-05-17 104 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

我发布的代码是简化版,实际代码太复杂了。 –