我有一个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运行。
答案 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();
}