似乎无法将 unique_ptr 分配给结构
Cannot seem to assign a unique_ptr to a struct
我在 class 上有一个指向结构的 unique_ptr 成员。
class ExampleClass {
std::unique_ptr<StateStruct> _character_state;
}
我不明白如何为结构获取内存并设置 unique_ptr。
在我的构造函数中我有:
ExampleClass::ExampleClass {
std::unique_ptr<StateStruct> _character_state(static_cast<StateStruct*>(malloc(sizeof(StateStruct))));
_character_state->state_member_int_value = 4 // _character_state is empty
}
我做错了什么?
ExampleClass::ExampleClass() : _character_state( new StateStruct() ) {
}
...或者如果您想稍后转移所有权(您也可以在构造函数中执行此操作,但不会清楚地传达您正在尝试做的事情)
_character_state.reset( new StateStruct() );
...或者为了完整起见,如果您喜欢打字
,您可以为您的变量分配一个新的unique_ptr
_character_state = std::unique_ptr<someObject>(new someObject());
好吧,不要使用 malloc。
std::unique_ptr<StateStruct> _character_state(static_cast<StateStruct*>(malloc(sizeof(StateStruct))));
^^^^^^
unique_ptr 通过调用 delete 释放内存(不是释放)。
您还在构造函数中创建了一个局部变量(不是初始化成员变量)。更喜欢在初始化列表中而不是在构造函数的主体中初始化成员变量。
ExampleClass::ExampleClass {
_character_state(new StateStruct)
{
// Should you not move this to the constructor
// if StateStruct
_character_state->state_member_int_value = 4
}
What am I doing wrong?
首先你的语法是错误的,你缺少括号。其次,在您的构造函数中,您正在创建局部变量 _character_state
,它将隐藏成员变量并使其保持未初始化状态。所以正确的语法是:
ExampleClass::ExampleClass() :
_character_state( std::make_unique<StateStruct>() )
{
_character_state->state_member_int_value = 4 // _character_state is empty
}
如果您出于任何原因必须使用 malloc()
创建 StateStruct
,您将需要提供自定义删除器,调用 free()
.
如果您真的不需要 malloc()
,您可能应该在 StateStruct
自己的构造函数中初始化 state_member_int_value
。
我在 class 上有一个指向结构的 unique_ptr 成员。
class ExampleClass {
std::unique_ptr<StateStruct> _character_state;
}
我不明白如何为结构获取内存并设置 unique_ptr。
在我的构造函数中我有:
ExampleClass::ExampleClass {
std::unique_ptr<StateStruct> _character_state(static_cast<StateStruct*>(malloc(sizeof(StateStruct))));
_character_state->state_member_int_value = 4 // _character_state is empty
}
我做错了什么?
ExampleClass::ExampleClass() : _character_state( new StateStruct() ) {
}
...或者如果您想稍后转移所有权(您也可以在构造函数中执行此操作,但不会清楚地传达您正在尝试做的事情)
_character_state.reset( new StateStruct() );
...或者为了完整起见,如果您喜欢打字
,您可以为您的变量分配一个新的unique_ptr
_character_state = std::unique_ptr<someObject>(new someObject());
好吧,不要使用 malloc。
std::unique_ptr<StateStruct> _character_state(static_cast<StateStruct*>(malloc(sizeof(StateStruct))));
^^^^^^
unique_ptr 通过调用 delete 释放内存(不是释放)。
您还在构造函数中创建了一个局部变量(不是初始化成员变量)。更喜欢在初始化列表中而不是在构造函数的主体中初始化成员变量。
ExampleClass::ExampleClass {
_character_state(new StateStruct)
{
// Should you not move this to the constructor
// if StateStruct
_character_state->state_member_int_value = 4
}
What am I doing wrong?
首先你的语法是错误的,你缺少括号。其次,在您的构造函数中,您正在创建局部变量 _character_state
,它将隐藏成员变量并使其保持未初始化状态。所以正确的语法是:
ExampleClass::ExampleClass() :
_character_state( std::make_unique<StateStruct>() )
{
_character_state->state_member_int_value = 4 // _character_state is empty
}
如果您出于任何原因必须使用 malloc()
创建 StateStruct
,您将需要提供自定义删除器,调用 free()
.
如果您真的不需要 malloc()
,您可能应该在 StateStruct
自己的构造函数中初始化 state_member_int_value
。