Проблема с возвратом QMap в качестве ссылки? - PullRequest
1 голос
/ 02 июля 2010

Приветствую всех,

У меня есть следующий фрагмент кода:

class AppCtx {

private:
 QMap<QString,IRzPlugin*> pluginsMap;

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

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

В моем клиентском коде я получаю доступ к QMap следующим образом. Но приложение разрывается, когда оно обращается к плагинам.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++)
   {

   }
 }

Отладочная информация приведена ниже:

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


}

какие-либо советы?

Заранее спасибо, umanga

1 Ответ

1 голос
/ 02 июля 2010

Я заметил, что вы копируете QMap с

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

Я предполагаю, что вы хотите взять ссылку на него, например

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

Если вам нужна только ссылка на constтогда документы говорят, что он неявно распространен, так что это не такая уж большая проблема.

Если это помогает вашей проблеме, то это должно быть связано с копированием QMap.

Редактировать

Поскольку это не помогло вашей проблеме, я думаю, вам нужно проверить указатель appctx, который передается в registerPlugins, и проверить, указывает ли он надействительный объект.

...