unique_ptr删除开销

68e*_*669 6 c++ smart-pointers raii c++11

在普通的C++设计中,大多数对象可以通过delete语句,free函数或特定于库的等效项来删除free.对于此类对象,unique_ptr Deleter实现可以是通过空基类优化消除的无状态对象.但是,某些库需要使用另一个对象(可能包含函数指针或其他某些上下文)来从该库中删除对象.

typedef struct lib_object lib_object;

struct lib_api {
  lib_object (*createInstance)();
  void (*freeInstance)(lib_object *o);
};
Run Code Online (Sandbox Code Playgroud)

可以unique_ptr通过将lib_api指针存储为自定义中的数据成员来包装它Deleter,但是如果lib_object需要管理多个实例,例如在容器中,则会使跟踪对象的内存开销加倍.在处理此库时,可以使用哪种模式来维护RAII原则,同时仍保持内存效率?

Mar*_*k B 5

如果只有一个lib_api对象,那么你可以让你的删除器获得一个静态指针.

如果可以有多个lib_api对象,那么您别无选择,只能在Deleter中存储指向它的指针.