【发布时间】:2016-10-10 20:30:20
【问题描述】:
在正常的 C++ 设计中,大多数对象可以通过 delete 语句、free 函数或等效于 free 的库特定的等价物来删除。对于此类对象,unique_ptrDeleter 实现可以是通过空基类优化消除的无状态对象。但是,有些库需要使用另一个对象(可能包含函数指针或其他上下文)从该库中删除对象。
typedef struct lib_object lib_object;
struct lib_api {
lib_object (*createInstance)();
void (*freeInstance)(lib_object *o);
};
可以通过将lib_api 指针作为数据成员存储在自定义Deleter 中来将其包装在unique_ptr 中,但是如果需要管理多个lib_object 实例,例如在容器中,它会使跟踪对象的内存开销加倍。在处理这个库时,可以使用哪种模式来维护 RAII 原则,同时仍然保持内存效率?
【问题讨论】:
-
你能让
lib_api*成为删除器类的静态成员吗? -
我认为您需要将
freeInstance存储在容器类的自定义派生类中,并且您的容器将包含lib_object*。在派生类中,您必须实现将在每个元素上调用freeInstance的析构函数。
标签: c++ c++11 smart-pointers raii