在Qt中卸载插件

时间:2012-04-09 16:53:21

标签: qt plugins qt4

当我尝试卸载加载的插件并加载一个新插件时出现问题。因此,两个插件都正确加载,但是当切换它们时(首先加载,第二个被卸载,反之亦然)我的应用程序崩溃了。可能是什么问题?

首先我正在尝试卸载存储在QPluginLoader的QList中的插件,然后我检查(从特殊菜单传递的id(整数)上的depdend以加载插件)要加载什么插件。第一次加载很好(第一个插件加载,此时没有任何东西卸载),第二次加载(卸载第一个插件,第二个加载),第三次加载我崩溃

void MainWindow::loadPluginUsingId (int plugin_id) {

        foreach (QPluginLoader* pluginLoader, plugins) {        
                 pluginLoader->unload();
                 delete pluginLoader;
               }

         switch (plugin_id) {

           case 0 : {

            foreach (QString fileName, pluginDir.entryList(QDir::Files)) {
               if (fileName == fullNameOfPlugins.value(plugin_id)) {
                     QPluginLoader* pluginLoader = new QPluginLoader(pluginDir.absoluteFilePath(fileName));
                     QObject *plugin = pluginLoader->instance();

                     IndicatorInterface *indicator = qobject_cast<IndicatorInterface*>(plugin);
                     indicator->initIndicator();
                     plugins.append(pluginLoader);
                 }
             }
         }

         break;
          case 1 : {

             foreach (QString fileName, pluginDir.entryList(QDir::Files)) {

                 if (fileName == fullNameOfPlugins.value(plugin_id)) {

                       QPluginLoader* pluginLoader = new          QPluginLoader(pluginDir.absoluteFilePath(fileName));
                       QObject* plugin = pluginLoader->instance();
                       PlotterInterface *plotter = qobject_cast<PlotterInterface*>(plugin);
                       plotter->initPlotter();
                       plugins.append(pluginLoader);
                     }
                 }
            }
         break;
           default :
               break;
           }
 }

1 个答案:

答案 0 :(得分:7)

    foreach (QPluginLoader* pluginLoader, plugins) {        
             pluginLoader->unload();
             delete pluginLoader; // this could be your problem
           }

您需要从插件列表中删除悬空指针。如果不这样做,将导致您所描述的内容。

试试这个:

while (!plugins.isEmpty()) {        
   QPluginLoader* pluginLoader = plugins.takeFirst();
   pluginLoader->unload();
   delete pluginLoader;
}