在单元测试中初始化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行将是

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

你看到问题了吗?您正在取消引用nullptr。您需要首先创建unique_ptr管理的foo对象

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

是的,您在哪里初始化std::unique_ptr

你不是,这就是为什么std::unique_ptr会指向nullptr,而你不能尊重它,所以你会遇到分割错误。

std::make_unique:初始化

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

是的。你需要用一个实际的对象初始化它,比如:

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

如果没有这一点,您将调用std::unique_ptr的默认构造函数,该构造函数将指向的底层成员设置为nullptr。因此,您对下一行的尊重是一个空指针取消引用。

您不将meanObj设置为指向/拥有任何东西。您需要使用foo对象初始化智能指针。

如果你不使用C++14,并且你不想在声明unique_ptr的地方初始化它,你可以进行

meanObj.reset( new foo() );

我知道您已经接受了答案,但据我所知,您根本不需要使用unique_ptr。只需使用对象本身:

foo meanObj;
meanObj.setMean(input);

相关内容

  • 没有找到相关文章

最新更新