Как вызвать указатель на указатель на функцию? - PullRequest
0 голосов
/ 10 октября 2019

Обычно я вызывал бы этот указатель функции, используя синтаксис, подобный следующему:

using func_ptr = void (*)();

// ...

(*func_ptr)();

При переносе указателя функции в unique_ptr ...

std::unique_ptr<func_ptr> fp;

fp = std::make_unique<func_ptr>((func_ptr) dlsym(handle, "somefunc"));

... как вызвать указатель на указатель на функцию? Я пытался ...

(**fp)();

безрезультатно.

1 Ответ

2 голосов
/ 10 октября 2019

При переносе указателя функции в unique_ptr ...

Это проблема, так как это не имеет смысла. Умные указатели предназначены для вещей, которые имеют четко определенную продолжительность жизни. Вещи, которые вы можете создавать и уничтожать. Обратите внимание, что в C и C++ функции имеют бесконечное время жизни, поэтому нет смысла использовать интеллектуальные указатели на функции.

Теперь, когда вы используете dlsym, задействованы динамические библиотеки (этовне стандарта). Вы можете подумать: «Да, моя функция имеет конечное время жизни, поскольку она загружена из DLL, поэтому настало время для умного указателя».

Идея может показаться удачной, но учтите, что ресурс для управления здесь нефункция, но сама библиотека. Вы открываете dll на dlopen и закрываете ее с dlclose. Таким образом, указатель на библиотеку должен управляться умным указателем! Это означает, что умный указатель на функцию по-прежнему не является хорошим выбором.

Надлежащим решением является использование boost::dll (библиотека только для заголовков), которая делает это для вас очень хорошим способом.

Если вы хотите сделать это самостоятельно, вам нужен:

  • класс, который будет управлять временем жизни dll (временем загрузки) - может управляться std::shared_ptr
  • классами, которые будут представлять функции вдлл. Они могут содержать shared_ptr для класса dll, чтобы гарантировать, что dll загружена, пока в этом dll есть какой-либо класс, содержащий указатель на функцию.
...