我需要在Qt中删除插件类中的点吗

  • 本文关键字:插件 删除 Qt c++ qt
  • 更新时间 :
  • 英文 :


现在,我完善我的问题。指针m_Core将被初始化,并且GetCore((将首先被调用。我最担心的是文档中说,当QPluginLoader完全卸载时,根组件将自动删除,我不知道Qt在销毁QPluginLoader和实例时如何处理内存。如果Qt会在QPluginLoader销毁之前删除Object,我不需要手动释放它。事实上,当我使delete m_Core无效时,Qt不会报告错误,如果我使其有效,Qt将报告段错误,因此Qt必须在调用~Mplugin((函数之前销毁Mplugin类。

m_Core是QWidget的派生类:SF_核心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类派生的插件类,并覆盖了MIngerfare中的函数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的每次调用都会分配一个新实例并造成内存泄漏。

然而,如果没有一个完整的例子,就很难理解SF_Core是如何使用的,尤其是在所有权是否转移的情况下。


堆栈变量修复

如果使用内部堆栈值,该怎么办?(不是最佳做法,但发布内部属性(

SF_Core* GetCore()
{
return &m_Core;
}    
private:
SF_Core m_Core;

使用shared_ptr的替代方案

另一种选择是使用智能指针(我强烈建议尽可能使用智能指针而不是原始指针(:

using SfCorePtr = std::shared_ptr<SF_Core>;
SfCorePtr GetCore()
{
if (!m_CorePtr)
{
m_CorePtr = std::make_shared<SF_Core>(); // Lazy creation
}
return m_CorePtr;
}    
private:
SfCorePtr m_Core;

提示:更为迂腐的是,std::weak_ptr的使用允许在不提供所有权的情况下访问智能指针:如果GetCore返回weak_ptr,则m_Core的所有权保留在该对象内部,并且所有权保持为树形而非图形。


最小修复

否则,只需修复您的代码:

#include "Mcore.h"
class Mplugin:public QObject,MInterface
{
Q_OBJECT
Q_PLUGIN_METADATA(IID INTERFACE_ID)
Q_INTERFACES(MInterface)
public:
Mplugin();
virtual ~Mplugin(){
delete m_Core;
}
SF_Core* GetCore(){
if (nullptr == m_Core){
m_Core = new SF_Core;
}
return m_Core;
}    
private:
SF_Core* m_Core=nullptr;
};

最新更新