views:

42

answers:

1

Greetings all,

I have a code snippet as follows :

class AppCtx {

private:
 QMap<QString,IRzPlugin*> pluginsMap;

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

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

In my client code I access the QMap as follows.But the application breaks where it access the '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 is given below :

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


}

any tips?

Thanks in advance, umanga

+1  A: 

I notice you are copying the QMap with

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

I assume you want to take a reference to it i.e.

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

If you only need a reference-to-const then the docs say that it is implicitly shared so it's not such a big deal.

If this helps your problem then it must be something to do with copying the QMap.

Edit

Since this didn't help your problem I think you need to check the pointer appctx that gets passed into registerPlugins and check if it points to a valid object.

Troubadour
thanks for the answer,I use your method and changed 'pluginsMap' into a pointer (*pluginsMap) .But still same issue.
umanga
@umanga: In that case you should look at the pointer `appctx` that's passed in to `registerPlugins` and check whether that is pointing to a valid object. It might be uninitialised, pointing to deleted memory, or corrupted in some other fashion.
Troubadour
thanks Troubadour for the tip. that was the issue, it was uninitialized !
umanga