【发布时间】:2021-02-16 22:28:27
【问题描述】:
现在,我完善我的问题。指针 m_Core 将被初始化,并且肯定会首先调用 GetCore()。我最关心的是文档说当 QPluginLoader 完全卸载时会自动删除根组件,我不不知道当 Qt 破坏 QPluginloader 和实例时 Qt 如何处理内存。如果Qt会在QPluginLoader销毁之前删除Object,我就不需要手动释放了。事实上,当我将delete m_Core无效时,Qt 不会报错,如果我有效,Qt 会报段错误,所以Qt 必须在调用~Mplugin() 函数之前破坏Mplugin 类。
m_Core 是 QWidget 的派生类: SF_Core.h
#include <QWidget>
class SF_Core:public QWidget
{
SF_Core(QWidget* parent):QWidget(parent){}
~SF_Core(){}
};
我通过 QPluginLoader 在我的项目中使用它,如下所示:
mainWindow.h
#include "MInterface.h"
#include "SF_Core.h"
#include <QWidget>
class MainWindow:public QWidget
{
Q_Object
MainWindow();
~MainWindow();
private:
MInterface* interface;
QObject* plugin;
MCore* core;
}
mainWindow.cpp
void mainWindow::mainWindow()
{
QPluginLoader loader("SF_Core.dll");
plugin = loader.instance();
interface = qobject_cast<MInterface* >(plugin);
core = interface->GetCore();
}
我有一个从Qt程序中的MIngerface类派生的插件类,并重写了MIngerface中的函数GetCore()。
#include "SF_Core.h"
class Mplugin:public QObject,MInterface
{
Q_OBJECT
Q_PLUGIN_METADATA(IID INTERFACE_ID)
Q_INTERFACES(MInterface)
public:
Mplugin();
~Mplugin(){
delete m_Core;
}
SF_Core* GetCore(){
m_Core = new SF_Core;
return m_Core;
}
private:
SF_Core* m_Core;
};
在主程序中,我通过QPluginLoader加载插件,并使用instance()获取根组件。当我终止程序时,它崩溃了。我发现错误来自这句话delete m_Core;如果我不删除m_Core,会导致内存泄漏吗?
【问题讨论】:
-
您确定至少调用了一次 GetCore 吗?也许它崩溃了,因为它从未被调用过,并且 m_Core 包含未初始化的垃圾(它不是智能指针,您没有在 ctor 中将其归零)。另一种可能性是调用 GetCore 并将“SF_Core”的所有权转移到某个 q 组件,该组件在应用程序关闭时为您销毁它,然后您的删除尝试第二次删除它。但你的情况是哪一种,扔硬币吧。
-
我建议要么使用
final,要么声明析构函数virtual。