在窗口小部件之间传输std :: unique_ptr

时间:2016-02-24 12:41:29

标签: c++ pointers smart-pointers unique-ptr

我有一个Widget类,它应该具有另一个Widget的唯一所有权。 我想实现一个将这个Widget传递给另一个Widget的函数。我了解到实现单一所有权概念的最佳方法是std::unique_ptr,但我无法让它运行

这是代码:

class Widget
{
public:
    Widget(void) { }
    virtual ~Widget(void) { /* */ }
    void successor(Widget&& successor)
    {
        this->_successor = std::unique_ptr<Widget>(&successor);
    }
    void refer_value(int a)
    {
        _successor->value = a;  
    }
    auto refer_value(void) const -> int
    {
        return _successor->value;
    }
    auto get(void) -> Widget&
    {
        return *_successor;
    }

    int value;
private:
    std::unique_ptr<Widget> _successor;
};

它编译没有问题,但当我尝试运行时:

int main(void)
{
    Widget a{};
    Widget b{};
    Widget c{};

    a.successor(Widget{});
    a.refer_value(5);

    b.successor(std::move(a.get()));
    std::cout << b.refer_value();
}

我收到了分段错误。有什么问题?

此外,如果我想传递Widget c,我将如何编写successor()函数的实现。我只能让它为rvalues运行。

1 个答案:

答案 0 :(得分:3)

下面

this->_successor = std::unique_ptr<Widget>(&successor);

您正在为对象创建一个unique_ptr,一旦范围退出就会被销毁。

此外,这里

b.successor(std::move(a.get()));

您正在获取unique_ptr中现有指针的地址,并将其分配给另一个 unique_ptr。这里到处都是错误/双重解除。

高度不知道你在这里尝试做什么。无论如何,如果我可以将自己限制在与内存管理相关的更改数量,以使此代码有意义:

class Widget
{
public:
    Widget(void) { }

    virtual ~Widget(void) { /* */ }

    void successor(std::shared_ptr<Widget> successor)
    {
        this->_successor = std::move(successor);
    }

    void refer_value(int a)
    {
        _successor->value = a;
    }

    auto refer_value(void) const -> int
    {
        return _successor->value;
    }

    std::shared_ptr<Widget> get()
    {
        return _successor;
    }

    int value;

private:
    std::shared_ptr<Widget> _successor;
};

int main(void)
{
    Widget a{};
    Widget b{};
    Widget c{};

    a.successor(std::make_shared<Widget>());
    a.refer_value(5);

    b.successor(a.get());
    std::cout << b.refer_value();
}