【问题标题】:Cannot seem to assign a unique_ptr to a struct似乎无法将 unique_ptr 分配给结构
【发布时间】:2015-08-04 21:10:49
【问题描述】:

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

我做错了什么?

【问题讨论】:

  • malloc() 而不是认真地使用new??
  • 你的结构可能没有正确初始化,因为你做了这个malloc 废话。您也很可能在这里甚至不需要指针。
  • 我特别喜欢 malloc() 与 C++ 风格转换的并置。
  • Err.. 没有人注意到他正在创建一个隐藏成员 _character_statelocal _character_state?这与malloc 有关。
  • 哈哈......是的,我还在学习......在我的辩护中,这代表了一个极度绝望的时刻。我正在使用一个超过 20 年的代码库。 @sbabbi,你能解释一下创建一个隐藏成员的本地状态是什么意思吗?

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


【解决方案1】:
ExampleClass::ExampleClass() : _character_state( new StateStruct() ) {

}

...或者如果您想稍后转移所有权(您也可以在构造函数中执行此操作,但不会清楚地传达您要执行的操作)

_character_state.reset( new StateStruct() );

...或者为了完整起见,如果您喜欢打字,可以为您的变量分配一个新的unique_ptr

_character_state = std::unique_ptr<someObject>(new someObject());

【讨论】:

  • 就个人而言,我更喜欢看到make_unique 而不是new
  • @Chris Drew 因为这个问题被标记为 C++11 而不是 C++14 stackoverflow.com/questions/7038357/… 注意:在形成我的笨拙回复之前,我必须先查看详细信息;)跨度>
【解决方案2】:

不要使用 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
}

【讨论】:

  • 坦率地说,你可以让它调用free(),但我看不出有任何理由使用 malloc/free
【解决方案3】:

我做错了什么?

首先你的语法是错误的,你缺少括号。其次,在您的构造函数中,您正在创建局部变量_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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    • 2018-03-29
    • 1970-01-01
    • 2023-01-26
    • 2019-03-24
    • 2019-06-26
    • 1970-01-01
    相关资源
    最近更新 更多