如何调用指向函数指针的指针?
Posted
技术标签:
【中文标题】如何调用指向函数指针的指针?【英文标题】:How to call a pointer to a function pointer? 【发布时间】:2019-10-10 15:04:46 【问题描述】:通常,我会使用如下语法调用此函数指针。
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)();
无济于事。
【问题讨论】:
@SPlatten 你说using
声明是错误的,但事实并非如此。 OP 试图取消引用类型别名的事实是错误。
我找不到任何描述 unique_ptr
如何处理函数指针的内容。我希望默认删除器尝试delete
不允许的函数指针。我不确定它是如何编译或为什么编译的。
将函数指针存储在std::unique_ptr
中似乎很奇怪......你真的需要删除它吗?
@Ender std::unique_ptr
默认管理动态分配的对象,这些对象是使用operator new
直接或间接通过std::make_unique
创建的,因此它在销毁时调用delete
。由于您的函数指针不是由 new 创建的,因此您将拥有 UB。但是如果你需要调用一些东西来清理它们,你可以使用 std::unique_ptr
和自定义删除器。但我相信 dlsym()
对象不需要清理,所以你使用 unique_ptr 的理由是虚假的。
@Ender 例如,使用调用dlclose()
的自定义删除器将共享库句柄存储在std::unique_ptr
中是个好主意。看来您需要学习如何使用智能指针以及它们的用途。
【参考方案1】:
将函数指针包装在 unique_ptr ...
这是一个问题,因为这没有意义。智能指针适用于具有有限明确生命周期的事物。你可以创造和摧毁的东西。请注意,C
和 C++
函数的生命周期不定式,因此没有必要使用指向函数的智能指针。
现在由于您使用的是dlsym
,因此涉及到动态库(这超出了标准)。你可能会想:“是的,我的函数的生命周期是有限的,因为它是从 dll 加载的,所以是时候使用智能指针了”。
想法可能很好,但请注意,此处用于管理的资源不是函数,而是库本身。您通过dlopen
打开dll 并使用dlclose
关闭它。所以库的句柄应该由智能指针管理!这意味着指向函数的智能指针仍然不是一个好的选择。
一个适当的解决方案是使用boost::dll
(仅标头库),它以非常好的方式为您做到这一点。
如果你想自己做,你需要:
将管理 dll 生命周期(加载时间)的类 - 可以由std::shared_ptr
管理
将代表 dll 中的函数的类。他们可能会将shared_ptr
保存到 dll 类,以确保只要有任何类持有指向该 dll 中函数的指针,就可以加载 dll。
【讨论】:
以上是关于如何调用指向函数指针的指针?的主要内容,如果未能解决你的问题,请参考以下文章
C语言基础:指针相关概念(指针的算术运算 指针数组指向指针的指针 传递指针给函数 从函数返回指针 )为啥C 语言不支持在调用函数时返回局部变量的地址?