我有一个类似于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
有点笨拙。
我想做的是有类似于 a 的东西managed_type
,shared_ptr
并且正在寻找不需要我全部写出来的想法。
编辑: 我在示例中纠正了我原来的错误。遗留 API 通过值而不是指针来获取不透明类型。