C 智能指针在std :: make_unique中丢失



我正在转换一些遗留代码以利用C 中的智能指针。但是,我遇到了一个努力弄清楚的运行时问题。我有以下代码:

struct foo {
    int field;
};
class SomeClass {
private:
    std::unique_ptr<foo> m_Foo;
    int m_Field;
public:
    SomeClass(std::unique_ptr<int> ctorArg)
        : m_Field(ctorArg->field), m_Foo(std::move(ctorArg)) {
    }
};
std::unique_ptr<foo> fooPtr{ new foo() };
auto const classInstance{ std::make_unique<SomeClass>(std::move(fooPtr)) };

如果我在调用SomeClass构造函数之前放了一个断点,我可以验证fooPtr不是null。但是,一旦我在SomeClass构造函数中,该应用程序在尝试初始化m_Field时就会崩溃,因为ctorArg为null(空)。这是预期的吗?如果我将构造函数签名更改为std::unique_ptr<int> &&,我会看到同样的问题。有人可以解释一下此代码的问题,以及如何修复它?

成员initializer-list的顺序无关紧要,会员将按声明的顺序初始化。

因此,第一个m_Foo(std::move(ctorArg))将归零ctorArg 然后 m_Field(ctorArg->field)将尝试放置一个空的ctorArg

将您的代码更改为:

class SomeClass {
private:
    std::unique_ptr<foo> m_Foo;
    int m_Field;
public:
    SomeClass(std::unique_ptr<int> ctorArg)
        : m_Foo(std::move(ctorArg)), m_Field(m_Foo->field) {
    }
};

也就是说,始终以该字段声明的顺序提及初始化器,并且不使用已从中移出的输入参数。

相关内容

  • 没有找到相关文章

最新更新