如何调用指向函数指针的指针?
How to call a pointer to a function pointer?
通常,我会使用如下语法调用此函数指针。
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)();
无果。
When wrapping a function pointer in a unique_ptr ...
这是个问题,因为这没有意义。智能指针适用于具有有限明确定义生命周期的事物。你可以创造和摧毁的东西。请注意,在 C
和 C++
中,函数的生命周期是不定式的,因此没有必要使用指向函数的智能指针。
现在,由于您正在使用 dlsym
,因此涉及到动态库(这超出了标准)。你可能会想:"yes my function has finite life time, since it is loaded from dll, so it is time for smart pointer".
想法可能不错,但注意这里管理资源不是函数,而是库本身。您正在通过 dlopen
打开 dll,并通过 dlclose
关闭它。所以库的句柄应该由智能指针管理!这意味着指向函数的智能指针仍然不是一个好的选择。
一个正确的解决方案是使用 boost::dll
(header 唯一的库),它以非常好的方式为您做到这一点。
如果您想自己动手,您需要:
- class 将管理 dll 生命周期(加载时间)- 可能由
std::shared_ptr
管理
- classes 表示 dll 中的函数。他们可以将
shared_ptr
保存到 dll class,以确保只要有任何 class 保存指向该 dll 中的函数的指针,就会加载 dll。
通常,我会使用如下语法调用此函数指针。
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)();
无果。
When wrapping a function pointer in a unique_ptr ...
这是个问题,因为这没有意义。智能指针适用于具有有限明确定义生命周期的事物。你可以创造和摧毁的东西。请注意,在 C
和 C++
中,函数的生命周期是不定式的,因此没有必要使用指向函数的智能指针。
现在,由于您正在使用 dlsym
,因此涉及到动态库(这超出了标准)。你可能会想:"yes my function has finite life time, since it is loaded from dll, so it is time for smart pointer".
想法可能不错,但注意这里管理资源不是函数,而是库本身。您正在通过 dlopen
打开 dll,并通过 dlclose
关闭它。所以库的句柄应该由智能指针管理!这意味着指向函数的智能指针仍然不是一个好的选择。
一个正确的解决方案是使用 boost::dll
(header 唯一的库),它以非常好的方式为您做到这一点。
如果您想自己动手,您需要:
- class 将管理 dll 生命周期(加载时间)- 可能由
std::shared_ptr
管理
- classes 表示 dll 中的函数。他们可以将
shared_ptr
保存到 dll class,以确保只要有任何 class 保存指向该 dll 中的函数的指针,就会加载 dll。