【问题标题】:Specify struct size for unique_ptr during initialization在初始化期间为 unique_ptr 指定结构大小
【发布时间】:2018-03-13 23:29:54
【问题描述】:

我正在尝试使用 C++ 中的 unique_ptr 来指向一个结构。初始化器不知道结构的定义。包含结构的头文件包含一个检索结构大小的函数,该结构通过create(void* memory) 调用构造并返回,其中memory 指向适当大小的数据块。

使用以下示例代码初始化此 unique_ptr(修复此错误后将添加 malloc 成功检查),导致编译时错误:error: invalid application of ‘sizeof’ to incomplete type ‘OlmAccount’,因为代码无法访问结构定义。

是否可以将结构的大小指定为唯一指针,从而有效地“覆盖”该结构的 sizeof 并解决此错误?

导致此问题的示例:

std::unique_ptr<OlmAccount>(static_cast<OlmAccount *>(olm_account(malloc(olm_account_size()))));

编辑: 类似的问题与指定删除器有关,并通过指定删除器来解决。但是,当这段代码适应使用 shared_ptr(它被定义为使用不完整的删除器正确编译)时,会抛出相同类型的大小错误:

error: invalid application of ‘sizeof’ to incomplete type ‘OlmAccount’ static_assert( sizeof(_Yp) > 0, "incomplete type" );

【问题讨论】:

  • 您需要为OlmAccount 提供自定义删除器,并在所有unique_ptrs 到OlmAccount 中使用此删除器。由于这看起来可能是 C 结构的 C++ 接口,因此您可能有一个 _destroy_free 在这种情况下可以轻松使用。
  • 感谢您的建议。我已经更新了我的问题(在编辑部分下)以解决删除器可能存在的问题。

标签: c++ struct


【解决方案1】:

Barmar 和 Daniel 是正确的,删除​​器是必要的。

由于默认删除器是调用sizeof的函数,提供自定义删除器将删除sizeof依赖。

Working Deleter

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-26
    • 2019-11-07
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多