[英]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.