将 unique_ptr 传递给派生类会导致 SEGFAULT

问题描述 投票:0回答:1

有人可以向我解释为什么在这里执行函数 foo() 会导致 SEGFAULT 吗?当我将 D 类中的 unique_ptr 对象更改为包含 B 类对象而不是 A 时,一切正常。

class A
{
    public:
    virtual void function() = 0;
};

class B : public A
{
    public:
    void function()
    {
        std::cout << "works!!";
    }
};

class D
{
    public:
    D(const std::unique_ptr<A>& arg): object(arg) {}

    void foo()
    {
        object->function();
    }

    private:
    const std::unique_ptr<A>& object;
};


int main()
{
    std::unique_ptr<B> object = std::make_unique<B>();
    D d(std::move(object));

    d.foo();
}

我很好奇这背后的逻辑是什么。

c++ unique-ptr derived-class
1个回答
0
投票

您将 reference 传递给智能指针对象。一旦创建了

d
对象,该智能指针对象就会被销毁。这会给您留下无效的参考。当您尝试使用它时,您将出现未定义的行为

而是通过指针对象按值传递,将其按值存储在对象中,然后将其移动到对象中:

class D
{
public:
    D(std::unique_ptr<A> arg): object(std::move(arg)) {}

    // ...

    std::unique_ptr<A> object;
};
© www.soinside.com 2019 - 2024. All rights reserved.