似乎无法为结构分配unique_ptr

时间:2015-08-04 21:10:49

标签: c++ c++11 smart-pointers unique-ptr

我在一个指向结构的类上有一个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
}

我做错了什么?

3 个答案:

答案 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