2010-07-02 9 views
1

Salutations tous,Problème avec le retour QMap comme référence?

J'ai un extrait de code comme suit:

class AppCtx { 

private: 
QMap<QString,IRzPlugin*> pluginsMap; 

public : 
void addPlugin(IRzPlugin *plugin) 
{ 
    pluginsMap.insert(plugin->getPluginUID(),plugin); 
} 

QMap<QString,IRzPlugin*> & getPlugins() 
{ 
    return pluginsMap; 
} 
} 

Dans mon code client j'accéder à la QMap comme follows.But les pauses d'application où il faut accéder au « plugins.size() '

class MainWindow 
. 
. 

{ 
void registerPlugins(AppCtx *appctx) 
{ 
    QMap<QString,IRzPlugin*> plugins=appctx->getPlugins(); 

    qDebug("Num of plugins %d",plugins.size()); //Breaks here 

    QList<IRzPlugin*> listPlugins=plugins.values(); 

    for(int i=0;i<listPlugins.size();i++) 
    { 

    } 
} 

debug info est donnée ci-dessous:

Program received signal SIGSEGV, Segmentation fault. 
[Switching to Thread 0x7fff057a16f0 (LWP 9069)] 
0x0000000000406ba1 in QMap<QString, IRzPlugin*>::size (this=0x405c2b) 
    at /opt/qtsdk-2010.02/qt/include/QtCore/qmap.h:178 
178  inline int size() const { return d->size; } 
(gdb) back 
#0 0x0000000000406ba1 in QMap<QString, IRzPlugin*>::size (this=0x405c2b) 
    at /opt/qtsdk-2010.02/qt/include/QtCore/qmap.h:178 
#1 0x0000000000406736 in MainWindow::registerPlugins (this=0x7fff0d7c98f0) 
    at /work/svn-checkout/osaka3d/osaka3d/tags/iter07/prototype/osaka3d/rinzo/ui/mainwindow.cpp:23 


} 

des astuces?

Merci à l'avance, umanga

+0

Si vous ne prévoyez pas de modifier la carte, il n'est pas non plus nécessaire de renvoyer une référence à la carte car Qt utilise un mécanisme de copie sur écriture pour la plupart des objets. Cela signifie que les données ne sont pas dupliquées si vous construisez une copie de QMap jusqu'à ce que vous changiez quelque chose. – humbagumba

Répondre

1

Je remarque que vous copiez le QMap avec

QMap<QString,IRzPlugin*> plugins=appctx->getPlugins(); 

Je suppose que vous voulez prendre une référence à ce à savoir

QMap<QString,IRzPlugin*>& plugins=appctx->getPlugins(); 

Si vous ne besoin d'une référence à const puis le docs dire qu'il est implicitement partagé, donc ce n'est pas un gros problème.

Si cela aide votre problème, cela doit être quelque chose à voir avec la copie du QMap.

Modifier

Depuis cela n'a pas aidé votre problème, je pense que vous devez vérifier le pointeur appctx qui est passé dans registerPlugins et vérifier si elle pointe vers un objet valide.

+0

merci pour la réponse, j'utilise votre méthode et a changé 'pluginsMap' dans un pointeur (* pluginsMap). Mais toujours le même problème. –

+0

@umanga: Dans ce cas, vous devriez regarder le pointeur 'appctx' qui est passé à' registerPlugins' et vérifier si cela pointe vers un objet valide. Il peut être non initialisé, pointant vers la mémoire supprimée, ou corrompu d'une autre manière. – Troubadour

+0

remercie Troubadour pour le conseil. c'était le problème, il n'était pas initialisé! –