我目前正在dlopen
某些插件项目中使用这些功能。
该函数句柄返回a void*
,然后将所有句柄保存到名为的映射中handles
:
void* handle = dlopen(path.c_str(), RTLD_LAZY);
handles[file] = handle;
我的目标是将所有权转让给地图,我当时想的是unique_ptr
,但不确定是否可行。
如果不可能,我还有哪些其他选择?
如果我理解正确,您可以执行类似的操作
定义关闭函数和指针类型的别名:
auto closeFunc = [](void* vp) {
dlclose(vp);
};
using HandlePtr = std::unique_ptr<void, decltype(closeFunc)>;
std::map<std::string, HandlePtr> handles;
然后创建句柄并添加到地图:
void* handle = dlopen(path.c_str(), RTLD_LAZY);
HandlePtr ptr( handle, closeFunc );
handles[file] = std::move( ptr );
然后,closeFunc
当唯一的ptr超出范围时将被调用
可以通过组合以上两行来防止原始指针:
HandlePtr handle(dlopen(path.c_str(), RTLD_LAZY), closeFunc );
handles[file] = std::move( handle );
这利用了std :: unique_ptr的第二个参数,该参数指定要使用的删除程序。
PS:map
s和unique_ptr
s不能按原样播放,根据您使用的C ++标准,您可能需要一些进位或移动。或shared_ptr
改为使用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句