Bonjour, voila mon code:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#ifndef COPYENGINEMANAGER_H
#define COPYENGINEMANAGER_H
 
#include <QObject>
#include <QPluginLoader>
#include <QList>
#include <QWidget>
#include <QString>
 
#include "Environment.h"
#include "GlobalClass.h"
#include "PluginInterface_CopyEngine.h"
 
namespace Ui {
	class CopyEngineOptions;
}
 
class CopyEngineManager : public QObject, public GlobalClass
{
	Q_OBJECT
public:
	explicit CopyEngineManager(QObject *parent = 0);
	PluginInterface_CopyEngine *getCopyEngine();
private slots:
	void onePluginAdded(QString category,QString path);
	void onePluginWillBeRemoved(QString category,QString path);
private:
	/// \brief the option interface
	Ui::CopyEngineOptions *ui;
	QWidget* tempWidget;
	struct CopyEnginePlugin
	{
		int id;
		QString path;
		QString pluginPath;
		QPluginLoader *pointer;
		QList<PluginInterface_CopyEngine *> intances;
	};
	typedef struct CopyEnginePlugin CopyEnginePlugin;
	QList<CopyEnginePlugin> pluginList;
	int nextOrderId;
	int copyEngineId;
	QList<quint32> engineIdList;
	int incrementId();
	void loadCopyEngine();
	void unloadCopyEngine(PluginInterface_CopyEngine *interface);
};
 
#endif // COPYENGINEMANAGER_H
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
#include "CopyEngineManager.h"
 
#include "ui_CopyEngineOptions.h"
 
CopyEngineManager::CopyEngineManager(QObject *parent) :
    QObject(parent),
      ui(new Ui::CopyEngineOptions())
{
	ULTRACOPIER_DEBUGCONSOLE(DebugEngine::Notice,"start()");
	copyEngineId=-1;
	//setup the ui layout
	tempWidget=new QWidget();
	ui->setupUi(tempWidget);
	QList<PluginsManager::PluginsAvailable> list=plugins->getPluginsByCategory("CopyEngine");
	foreach(PluginsManager::PluginsAvailable currentPlugin,list)
		onePluginAdded(currentPlugin.category,currentPlugin.pluginPath);
	//load the options
	QList<QPair<QString, QVariant> > KeysList;
	KeysList.append(qMakePair(QString("CopyEngine"),QVariant("CopyEngine-Qt")));
	options->addOptionGroup("CopyEngine",KeysList,"interface",ui->formLayout);
	options->setTabText("interface",tr("Interface"));
	connect(plugins,SIGNAL(onePluginAdded(QString,QString)),		this,SLOT(onePluginAdded(QString,QString)));
	connect(plugins,SIGNAL(onePluginWillBeRemoved(QString,QString)),	this,SLOT(onePluginWillBeRemoved(QString,QString)),Qt::BlockingQueuedConnection);
	loadCopyEngine();
}
 
void CopyEngineManager::onePluginAdded(QString category,QString path)
{
	if(category!="CopyEngine")
		return;
	QList<PluginsManager::PluginsAvailable> list=plugins->getPluginsByCategory("CopyEngine");
	foreach(PluginsManager::PluginsAvailable currentPlugin,list)
		if(currentPlugin.pluginPath==path)
		{
			ui->copyEngine->addItem(plugins->getTranslatedText(currentPlugin,"name",languages->getMainShortName()),currentPlugin.internalName);
			return;
		}
}
 
void CopyEngineManager::onePluginWillBeRemoved(QString category,QString path)
{
	if(category!="CopyEngine")
		return;
	QList<PluginsManager::PluginsAvailable> list=plugins->getPluginsByCategory("CopyEngine");
	foreach(PluginsManager::PluginsAvailable currentPlugin,list)
		if(currentPlugin.pluginPath==path)
		{
			if(ui->copyEngine->findData(currentPlugin.internalName)!=-1)
				ui->copyEngine->removeItem(ui->copyEngine->findData(currentPlugin.internalName));
			else
				ULTRACOPIER_DEBUGCONSOLE(DebugEngine::Error,"Unable to locate the entry");
			options->applyOptionValue("CopyEngine","CopyEngine");
			int index=0;
			while(index<pluginList.size())
			{
				if(pluginList.at(index).path==currentPlugin.pluginPath)
				{
					if(pluginList.at(index).id==copyEngineId)
					{
						copyEngineId=-1;
						if(pluginList.at(index).intances.size()<=0)
						{
							if(pluginList.at(index).pointer->unload())
							{
								engineIdList.removeOne(pluginList.at(index).id);
								pluginList.removeAt(index);
							}
						}
					}
					return;
				}
				index++;
			}
			return;
		}
	loadCopyEngine();
}
 
void CopyEngineManager::loadCopyEngine()
{
	copyEngineId=-1;
	if(ui->copyEngine->currentIndex()==-1)
	{
		ULTRACOPIER_DEBUGCONSOLE(DebugEngine::Warning,"Current item selection not found");
		return;
	}
	QString name=ui->copyEngine->itemData(ui->copyEngine->currentIndex()).toString();
	QList<PluginsManager::PluginsAvailable> list=plugins->getPluginsByCategory("CopyEngine");
	foreach(PluginsManager::PluginsAvailable currentPlugin,list)
		if(currentPlugin.internalName==name)
		{
			//setFileName
			QString pluginPath=currentPlugin.pluginPath+PluginsManager::getResolvedPluginName("copyEngine");
			//search into loaded session
			int index=0;
			while(index<pluginList.size())
			{
				if(pluginList.at(index).pluginPath==pluginPath)
				{
					copyEngineId=pluginList.at(index).id;
					return;
				}
				index++;
			}
			CopyEnginePlugin newItem;
			newItem.id=incrementId();
			newItem.pluginPath=pluginPath;
			newItem.path=currentPlugin.pluginPath;
			newItem.pointer=new QPluginLoader(newItem.pluginPath);
			if(newItem.pointer->load())
				pluginList<<newItem;
			else
				ULTRACOPIER_DEBUGCONSOLE(DebugEngine::Warning,"unable to load the plugin: "+newItem.pointer->errorString());
			return;
		}
}
 
void CopyEngineManager::unloadCopyEngine(PluginInterface_CopyEngine *intance)
{
	int index=0;
	while(index<pluginList.size())
	{
		if(pluginList.at(index).intances.contains(intance))
		{
			intance->deleteLater();
			pluginList[index].intances.removeOne(intance);
			if(pluginList.at(index).intances.size()<=0 && pluginList.at(index).id!=copyEngineId)
			{
				engineIdList.removeOne(pluginList.at(index).id);
				if(pluginList.at(index).pointer->unload())
					pluginList.removeAt(index);
			}
			return;
		}
		index++;
	}
}
 
PluginInterface_CopyEngine * CopyEngineManager::getCopyEngine()
{
	int index=0;
	while(index<pluginList.size())
	{
		if(pluginList.at(index).id!=copyEngineId)
		{
			QObject *plugin = pluginList.at(index).pointer->instance();
			if(plugin)
			{
				PluginInterface_CopyEngine *currentCopyEngine = qobject_cast<PluginInterface_CopyEngine *>(plugin);
				if(currentCopyEngine)
				{
					pluginList[index].intances << currentCopyEngine;
					return currentCopyEngine;
				}
				else
					return NULL;
			}
			else
				return NULL;
		}
		index++;
	}
	return NULL;
}
 
int CopyEngineManager::incrementId()
{
	do
	{
		nextOrderId++;
		if(nextOrderId>2000000)
			nextOrderId=0;
	} while(engineIdList.contains(nextOrderId));
	return nextOrderId;
}
Et voila le back trace:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
0        QBasicAtomicInt::deref        qatomic_x86_64.h        133        0x40de9c        
1        QString::~QString        qstring.h        883        0x40e00f        
2        CopyEngineManager::CopyEnginePlugin::~CopyEnginePlugin        CopyEngineManager.h        30        0x417cbc        
3        CopyEngineManager::loadCopyEngine        CopyEngineManager.cpp        114        0x45879f        
4        CopyEngineManager::CopyEngineManager        CopyEngineManager.cpp        24        0x457638        
5        EventDispatcher::EventDispatcher        EventDispatcher.cpp        15        0x413ef7        
6        main        main.cpp        24        0x41317e
Il crash à la destruction de l'object créé à la ligne 105 dans le fichier .cpp.
Je ne comprends pas pourquoi.

Merci d'avance de votre aide.