1

皆さん、こんにちは。

次のようなコード スニペットがあります。

class AppCtx {

private:
 QMap<QString,IRzPlugin*> pluginsMap;

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

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

私のクライアント コードでは、次のように QMap にアクセスします。しかし、アプリケーションは「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++)
   {

   }
 }

デバッグ情報を以下に示します。

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


}

任意のヒント?

前もってありがとう、ウマンガ

4

1 に答える 1

1

QMapをコピーしていることに気づきました

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

私はあなたがそれを参照したいと思いますすなわち

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

constへの参照のみが必要な場合、ドキュメントには、暗黙的に共有されるため、それほど大したことではないと記載されています。

これが問題を解決する場合は、をコピーすることと関係があるはずですQMap

編集

appctxこれは問題を解決しなかったので、渡されるポインターをチェックしregisterPlugins、それが有効なオブジェクトを指しているかどうかをチェックする必要があると思います。

于 2010-07-02T08:46:56.340 に答える