我有一个类似于 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/