我在一个指向结构的类上有一个unique_ptr成员。
class ExampleClass {
std::unique_ptr<StateStruct> _character_state;
}
我不明白如何获取struct的内存并设置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
}
我做错了什么?
答案 0 :(得分:2)
ExampleClass::ExampleClass() : _character_state( new StateStruct() ) {
}
...或者如果您想稍后转移所有权(您也可以在构造函数中执行此操作,但不会明确表达您要执行的操作)
_character_state.reset( new StateStruct() );
...或者为了完整起见,如果您喜欢打字,可以为您的变量指定一个新的unique_ptr
_character_state = std::unique_ptr<someObject>(new someObject());
答案 1 :(得分:1)
好吧,不要使用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
}
答案 2 :(得分:0)
我做错了什么?
首先你的语法错了,你缺少括号。其次,在构造函数中创建局部变量_character_state
,它将隐藏成员变量并使其保持未初始化状态。所以正确的语法是:
ExampleClass::ExampleClass() :
_character_state( std::make_unique<StateStruct>() )
{
_character_state->state_member_int_value = 4 // _character_state is empty
}
如果由于watever原因,您必须使用StateStruct
创建malloc()
,则需要提供调用free()
的自定义删除工具。
如果你真的不需要malloc()
,你可能应该在state_member_int_value
自己的构造函数中初始化StateStruct
。