2012-04-09 3 views
3

Проблема возникает, когда я пытаюсь выгрузить загруженный плагин и загрузить новый. Таким образом, оба плагина загружаются правильно, но при их переключении (сначала загружается, второй разгружается и наоборот) мое приложение падает. В чем проблема?Выгрузить плагин в Qt

Сначала я пытаюсь выгрузить плагин, сохраненный в QList QPluginLoader, затем я проверяю (depdend на id (целое число), переданное из специального меню для загрузки плагинов), какой плагин загружается. Первая нагрузка хорошо (первый плагин загружен, ничего в этот момент не выгрузить), вторую загрузку (выгрузки первого плагина, второй загружен), на третьей нагрузке я получаю аварию

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

Где крах? – Macke

+1

внутри петли forech –

+0

Каков тип 'plugins' в' foreach (QPluginLoader * pluginLoader, плагины) '? – cgmb

ответ

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; 
} 
+0

спасибо, он работает. –

Смежные вопросы