当我尝试卸载已加载的插件并加载一个新插件时出现问题。所以两个插件都正确加载,但是当切换它们(第一个加载,第二个卸载,反之亦然)时,我的应用程序崩溃了。可能有什么问题?
首先,我正在做什么,我尝试卸载一个存储在 QPluginLoader 的 QList 中的插件,然后我检查(从用于加载插件的特殊菜单中传递的 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;
}
}
foreach (QPluginLoader* pluginLoader, plugins) {
pluginLoader->unload();
delete pluginLoader; // this could be your problem
}
您需要从插件列表中删除悬空指针。如果不这样做,将导致您所描述的内容。
试试这个:
while (!plugins.isEmpty()) {
QPluginLoader* pluginLoader = plugins.takeFirst();
pluginLoader->unload();
delete pluginLoader;
}