Если я правильно понимаю, вы можете сделать что-то вроде
Определить функцию закрытия и псевдоним для типа указателя:
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
вместо этого.