IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

Crash lors d'un destrcuteur


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de alpha_one_x86
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 411
    Par défaut Crash lors d'un destrcuteur
    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.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 13
    Par défaut
    Le crash est dans le dtor de CopyEnginePlugin.

    Faudrait voir ce que tu fais dans cette classe car ici tu as juste collé le code du manager.
    Maintenant, ca place un nouvel objet sur la stack qui viennent se faire dégomer au return (ligne 114 là où ca crash). Naïvement j'aurai pensé que c'était le boulot du manager de détruire tes instances de CopyEnginePlugin, donc creation via un new de CopyEnginePlugin (donc on the heap) et dans le dtor du copyEngineManager, on vide la liste et on décharge (t'as l'air de faire ca dans unloadCopyEngine() ).
    Ca me semble plus sain.
    Après ca peut etre aussi un mélange entre des libs statiques et dynamique. Genre le plugin que tu charges est une static lib, là où ton manager est une dll.

Discussions similaires

  1. dosemu crash lors de l'utilisation d'un logiciel
    Par olivier131313 dans le forum Applications et environnements graphiques
    Réponses: 0
    Dernier message: 21/06/2010, 11h44
  2. Crash lors de l'utilisation des VBO
    Par Julien Bodin dans le forum OpenGL
    Réponses: 0
    Dernier message: 03/03/2009, 21h54
  3. Crash lors de l'ouverture de mon programme
    Par jimmplan dans le forum MFC
    Réponses: 16
    Dernier message: 16/10/2008, 22h35
  4. Crashs lors du lancement de programmes
    Par smarties dans le forum Windows XP
    Réponses: 3
    Dernier message: 30/08/2008, 13h59
  5. glade-- : crash lors de la génération c++
    Par Patriarch24 dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 30/04/2007, 10h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo