簡體   English   中英

在小部件之間傳輸std :: unique_ptr

[英]Transferring std::unique_ptr between Widgets

我有一個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()函數的實現。 我只能讓它為右值運行。

這里

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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM