这是this一个的后续问题。
我正在使用dlopen
和dlclose
函数来加载/卸载共享库。 (它们都返回void *)。
我将dlopen
句柄保存在字典中。
每次从地图中删除元素时,应自动调用dlclose
函数。
这就是我所拥有的:
auto closeFunc = [](void* vp) {
dlclose(vp);
};
using HandlePtr = std::unique_ptr<void, decltype(closeFunc)>;
std::map<std::string, HandlePtr> handles;
HandlePtr handle(dlopen(path.c_str(), RTLD_LAZY), closeFunc );
handles[nameStr] = std::move( handle );
我的问题是,当我想遍历地图的键(字符串)并打印它们时,它迫使我取地址:
vector<string> SharedLibrary::GetLoadedLibraries() {
vector<string> loadedLibraries;
for(auto& kv: handles) {
loadedLibraries.push_back(kv.first);
}
return loadedLibraries;
}
因此,当loadLibraries超出范围时,它将清除我的地图。
如果我不引用该文件,则会出现编译错误“ using a deleted function
”。
对此我有点困惑。从地图检索密钥的正确方法是什么?