如何调用指向函数指针的指针?

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 ...

这是一个问题,因为这没有意义。智能指针适用于具有有限明确生命周期的事物。你可以创造和摧毁的东西。请注意,CC++ 函数的生命周期不定式,因此没有必要使用指向函数的智能指针。

现在由于您使用的是dlsym,因此涉及到动态库(这超出了标准)。你可能会想:“是的,我的函数的生命周期是有限的,因为它是从 dll 加载的,所以是时候使用智能指针了”。

想法可能很好,但请注意,此处用于管理的资源不是函数,而是库本身。您通过dlopen 打开dll 并使用dlclose 关闭它。所以库的句柄应该由智能指针管理!这意味着指向函数的智能指针仍然不是一个好的选择。

一个适当的解决方案是使用boost::dll(仅标头库),它以非常好的方式为您做到这一点。

如果你想自己做,你需要:

将管理 dll 生命周期(加载时间)的类 - 可以由 std::shared_ptr 管理 将代表 dll 中的函数的类。他们可能会将shared_ptr 保存到 dll 类,以确保只要有任何类持有指向该 dll 中函数的指针,就可以加载 dll。

【讨论】:

以上是关于如何调用指向函数指针的指针?的主要内容,如果未能解决你的问题,请参考以下文章

c++类的成员函数指针如何转为普通指针

c++的函数指针是怎么用的呀?

如何从静态成员函数调用指向成员函数的指针?

C语言基础:指针相关概念(指针的算术运算 指针数组指向指针的指针 传递指针给函数 从函数返回指针 )为啥C 语言不支持在调用函数时返回局部变量的地址?

如何从指向该函数的指针调用函数?

C语言中如何显示指针所指向的数