c++ - 使用boost的shared_ptr管理C类型生命周期?

标签 c++ boost shared-ptr object-lifetime

我有一个类似于 How to manage object life time using Boost library smart pointers? 的问题但是,就我而言,“对象”根本不是 C++ 对象,而是从 C API 返回/传递的不透明类型。该类型没有指针语义,即没有解引用;然而,它作为参数传递给 C API 中的其他函数。该类型还具有明确的close为了清理内部资源而必须调用的API。

所以,我有一个 C API,类似于

opaque_legacy_type_t x;
XXopen(..., &x); // allocates/opens resource and fills out 'x' to be used later
XXdoSomethingWithResource(x, ...); // do something with resources related to 'x'
...more actions...
XXclose(x); // closes and cleans up resources related to 'x'

出于各种原因,在我的 C++ 代码中,我希望管理 opaque_legacy_type_t 的“实例”,就像管理堆分配的对象实例一样,即具有与 boost::shared_ptr<> 类似的共享语义。 。看来shared_ptr提供的内容足以让我可以调用电话 XXclose通过这样做:

opaque_legacy_type_t x;
XXopen(..., &x);
boost::shared_ptr<opaque_legacy_type_t> managed(x, XXclose);

但是,自从 opaque_legacy_type_t没有指针语义,managed的用法有点笨拙。

我想做的是类似 managed_type 的东西类似于 shared_ptr ,并且正在寻找不需要我全部写下来的想法。

编辑: 我纠正了示例中最初的错误。旧版 API 通过值而不是指针获取不透明类型。

最佳答案

由于所有旧版 API 都采用指向不透明类型的指针,因此您可以直接使用共享指针。关键是您不要在堆栈上声明原始结构,而是通过 new 分配它:

int main () {
    std::shared_ptr<opaque_legacy_type_t> x(new opaque_legacy_type_t,
        [](opaqeue_legacy_type_t* p) { XXClose(p); delete p; });
    XXopen(..., x.get());
    XXdoSomethingWithResource(x.get(), ...);
}


编辑:如果某些 API 按值而不是指针获取不透明类型,则传递取消引用的指针。

int main () {
    std::shared_ptr<opaque_legacy_type_t> x(new opaque_legacy_type_t,
        [](opaqeue_legacy_type_t* p) { XXClose(*p); delete p; });
    XXopen(..., x.get());
    XXdoSomethingWithResource(*x, ...);
}

关于c++ - 使用boost的shared_ptr管理C类型生命周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9300614/

相关文章:

c++ - 将 boost::asio::post 用于接受参数的函数

c++ - 如何比较自定义类的 std::variant?

c++ - BGL 自定义图 connected_components

c++ - 模板的显式特化

c++ - "thrift -gen cpp"生成的代码无法在 macOS : 'boost/tr1/functional.hpp' file not found 上编译

c++ - `weak_ptr::expired` 对象 dtor 中的行为

c++ - 尝试通过共享指针使用变量时读取访问冲突

c++ - 亚信 : usage of self shared pointer in the examples

c++ - MSI 文件命令行参数解析

c++ - 如何在 IDE 中让 CMake 显示不属于任何二进制目标的 header ?