我开发了一个加载dll插件的Windows应用程序,我希望这些插件可以与其他编译器兼容(MinGW)
所以我实现了一个插件接口类PluginInterface
,它只有纯虚函数。该插件导出两个C函数,一个用于创建一个派生自PluginInterface
的对象并在其上返回一个指针,另一个函数用于删除该对象。
问题是如果我有PluginInterface
的虚拟析构函数,则接口在编译器之间变为非二进制兼容(例如MinGW / MSVC)。如果我没有定义析构函数(或默认的析构函数),gcc会警告删除具有非虚析构函数的多态对象,并且可能导致未定义的行为。
如何彻底删除该警告并确保不会发生未定义的行为?
由于
答案 0 :(得分:0)
如果要从PluginInterface
继承,则在使用虚函数时需要使用虚拟析构函数。将析构函数标记为虚拟是销毁作为基础对象转换的派生对象的唯一方法。如果析构函数不是虚拟的,则只会破坏派生对象的基本部分,其余部分将处于不确定行为的不确定状态。
答案 1 :(得分:0)
但为什么你需要类中的析构函数实际上是一个接口?我认为你应该只从dll(查询和发布)导出两个函数。 Query可以在DLL端实例化对象并将PluginInterface指针返回给新创建的对象。 Release也可以直接在对象上调用DLL端的析构函数。您还可以将DLL实现为单例,以确保您的插件仅提供给定对象的一个实例,而您不必担心计算它们。