在单元测试中初始化 unique_ptr
Initialise unique_ptr in the unit tests
我有以下代码:
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
初始化有问题吗?
是的。你需要用一个实际的对象来初始化它,像这样:
std::unique_ptr<foo> meanObj(std::make_unique<foo>());
如果不这样做,您将调用 std::unique_ptr
的默认构造函数,它将指向的基础成员设置为 nullptr
。因此,您在下一行的引用是空指针取消引用。
是的,你在哪里初始化std::unique_ptr
?
你不是,这就是 std::unique_ptr
将指向 nullptr
的原因,你不能尊重它,所以你遇到了分段错误。
初始化为std::make_unique
:
std::unique_ptr<foo> meanObj = std::make_unique<foo>();
使用原始指针重写的示例的最后两行将是
foo* meanObj = nullptr;
meanObj->setMean(input);
你看到问题了吗?您正在取消引用 nullptr
。您需要先创建一个 foo
对象,由 unique_ptr
管理
auto meanObj(std::make_unique<foo>());
// or std::unique_ptr<foo> meanObj(new foo);
meanObj->setMean(input);
您没有将 meanObj
设置为 point/own 任何内容。您需要使用 foo
对象初始化智能指针。
如果您不使用 C++14 并且不想在声明它的同一位置初始化您的 unique_ptr
,您可以这样做
meanObj.reset( new foo() );
我知道您已经接受了答案,但据我所知,您根本不需要使用 unique_ptr
。只需使用对象本身:
foo meanObj;
meanObj.setMean(input);
我有以下代码:
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
初始化有问题吗?
是的。你需要用一个实际的对象来初始化它,像这样:
std::unique_ptr<foo> meanObj(std::make_unique<foo>());
如果不这样做,您将调用 std::unique_ptr
的默认构造函数,它将指向的基础成员设置为 nullptr
。因此,您在下一行的引用是空指针取消引用。
是的,你在哪里初始化std::unique_ptr
?
你不是,这就是 std::unique_ptr
将指向 nullptr
的原因,你不能尊重它,所以你遇到了分段错误。
初始化为std::make_unique
:
std::unique_ptr<foo> meanObj = std::make_unique<foo>();
使用原始指针重写的示例的最后两行将是
foo* meanObj = nullptr;
meanObj->setMean(input);
你看到问题了吗?您正在取消引用 nullptr
。您需要先创建一个 foo
对象,由 unique_ptr
管理
auto meanObj(std::make_unique<foo>());
// or std::unique_ptr<foo> meanObj(new foo);
meanObj->setMean(input);
您没有将 meanObj
设置为 point/own 任何内容。您需要使用 foo
对象初始化智能指针。
如果您不使用 C++14 并且不想在声明它的同一位置初始化您的 unique_ptr
,您可以这样做
meanObj.reset( new foo() );
我知道您已经接受了答案,但据我所知,您根本不需要使用 unique_ptr
。只需使用对象本身:
foo meanObj;
meanObj.setMean(input);