При переносе указателя функции в unique_ptr ...
Это проблема, так как это не имеет смысла. Умные указатели предназначены для вещей, которые имеют четко определенную продолжительность жизни. Вещи, которые вы можете создавать и уничтожать. Обратите внимание, что в C
и C++
функции имеют бесконечное время жизни, поэтому нет смысла использовать интеллектуальные указатели на функции.
Теперь, когда вы используете dlsym
, задействованы динамические библиотеки (этовне стандарта). Вы можете подумать: «Да, моя функция имеет конечное время жизни, поскольку она загружена из DLL, поэтому настало время для умного указателя».
Идея может показаться удачной, но учтите, что ресурс для управления здесь нефункция, но сама библиотека. Вы открываете dll на dlopen
и закрываете ее с dlclose
. Таким образом, указатель на библиотеку должен управляться умным указателем! Это означает, что умный указатель на функцию по-прежнему не является хорошим выбором.
Надлежащим решением является использование boost::dll
(библиотека только для заголовков), которая делает это для вас очень хорошим способом.
Если вы хотите сделать это самостоятельно, вам нужен:
- класс, который будет управлять временем жизни dll (временем загрузки) - может управляться
std::shared_ptr
- классами, которые будут представлять функции вдлл. Они могут содержать
shared_ptr
для класса dll, чтобы гарантировать, что dll загружена, пока в этом dll есть какой-либо класс, содержащий указатель на функцию.