在普通的C++设计中,大多数对象可以通过delete
语句、free
函数或类库特定等效的free
来删除。对于这些对象,unique_ptr
的Deleter
实现可以是一个无状态对象,通过空基类优化消除。然而,一些库要求使用另一个对象(可能包含函数指针或其他上下文)来从该库中删除对象。
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*
设为删除器类的静态成员吗? - Brian BifreeInstance
存储在容器类的自定义派生类中,并且你的容器将包含lib_object*
。在派生类中,你必须实现析构函数,该函数将在每个元素上调用freeInstance
。 - Franck