Как перебрать ключи строки карты с unique_ptr в качестве значений? - PullRequest
0 голосов
/ 27 мая 2019

Это следующий вопрос по 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".

Меня это немного смущает.Как правильно получить ключи с карты?

...