【发布时间】:2012-02-15 20:12:58
【问题描述】:
我有一个类似于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 的用法有点笨拙。
我想做的是有一个类似于shared_ptr 的managed_type,并且正在寻找不需要我全部写出来的想法。
编辑: 我在示例中纠正了我原来的错误。旧版 API 通过值而不是指针获取不透明类型。
【问题讨论】:
-
this question 会覆盖您的用例吗?
-
@Matt:这个问题几乎涵盖了用例,特别是我在一个小测试用例中实现的 RAIIFunc 模板。它没有涵盖的是共享方面,我可以获取一个 RAIIFunc 实例并将其分配给另一个实例,当最后一个 RAIIFunc 消失时,仍然只能调用一次 XXclose() 。我想我可以用 shared_ptr 包装 RAIIFunc 并以这种方式获取计数的主体,但如果我正在编写代码,我想避免堆分配。
标签: c++ boost shared-ptr object-lifetime