【问题标题】:unique_ptr to an opaque struct? (C++)unique_ptr 到一个不透明的结构? (C++)
【发布时间】:2016-03-11 20:14:00
【问题描述】:

一个库定义了一个不透明的数据类型:

struct OpaqueStruct;

并且客户端代码必须获得并释放OpaqueStruct*。我可以访问库源。

不幸的是,shared_ptr 和 unique_ptr 都无法存储该指针 错误:“sizeof”对不完整类型的无效应用。

我能想到的最好的办法就是借用 finally 守卫from this post。

如何将 RAII 用于不透明的结构指针?

【问题讨论】:

  • @TC:遗憾的是,重复问题的答案没有解释如何使用带有 std::unique_ptr<T> 的自定义删除器在未定义 T 的上下文中创建这些实体(答案不过,StoryTeller 指出的问题确实如此)。
  • 我已回滚您的编辑,因为在问题中包含答案是不合适的。如果您认为应该重新打开此问题以便您可以发布自己的答案,您应该编辑您的问题以解释为什么重复无法解决它。
  • @IKavanagh 那么,您能重定向重复标记吗?目前它被标记为不包含答案的问题的重复。
  • 被审查的答案:std::unique_ptr<OpaqueStruct, void(*)(OpaqueStruct*)> ops(newOpaqueStruct(), deleteOpaqueStruct);

标签: c++ c++11 c++14 opaque-pointers


【解决方案1】:

您只能构造和删除完整类型,另请参见此处:Deletion of pointer to incomplete type 'Point'; no destructor called。所以至少进行构造/销毁的代码片段需要知道完整的类型。

您可以使用不完整的类型声明 unique_ptr 或 shared_ptr。对于这些智能指针的哪些成员可以在只知道不完整类型的上下文中使用,请参阅Is std::unique_ptr<T> required to know the full definition of T?。

【讨论】:

    【解决方案2】:
    std::unique_ptr<OpaqueStruct, void(*)(OpaqueStruct*)>
                   ops(newOpaqueStruct(), deleteOpaqueStruct)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      • 2020-05-17
      • 2016-12-26
      • 1970-01-01
      • 2021-08-30
      相关资源
      最近更新 更多