Это следующий вопрос по this one.
Я использую функции 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;
}
Из-за этого он очистит мою карту, когда загруженные библиотеки выйдут из области видимости.
Если я не беру ссылку, у меня будет ошибка компиляции "using a deleted function
".
Меня это немного смущает.Как правильно получить ключи с карты?