传递带有派生类的unique_ptr会导致 SEGFAULT

Passing unique_ptr with derived class causes SEGFAULT

提问人:szj 提问时间:8/4/2023 更新时间:8/4/2023 访问量:86

问:

有人可以向我解释为什么在这里执行函数 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 派生类

评论

1赞 273K 8/4/2023
由于类型不相等,因此将创建一个临时唯一指针,并存储对临时的引用。
0赞 Jarod42 8/4/2023
也缺少虚拟析构函数。A
0赞 Aykhan Hagverdili 8/4/2023
该成员是悬空的引用。object
0赞 Jarod42 8/4/2023
有成员很奇怪。要么更好,要么看起来更好,这取决于意图。const std::unique_ptr<A>& object;/*const*/ std::unique_ptr<A> object;/*const*/ A& object;
2赞 john 8/4/2023
如果您觉得有必要在类中存储对指针的引用,那么您可能做错了什么。

答:

6赞 Some programmer dude 8/4/2023 #1

传递对智能指针对象的引用。此智能指针对象将在创建对象后立即被销毁。这会给你留下一个无效的引用。当您尝试使用它时,您将出现未定义的行为d

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

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

    // ...

    std::unique_ptr<A> object;
};