2010-07-02 42 views
1

大家好,问题与QMap返回作为参考?

我有一个代码片段如下:

class AppCtx { 

private: 
QMap<QString,IRzPlugin*> pluginsMap; 

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

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

在我的客户端代码中,我访问QMAP作为follows.But的应用程序中断 地方访问“plugins.size()

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 


} 
:“

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++) 
    { 

    } 
} 

调试信息在下面给出

任何提示?

由于提前, umanga

+0

如果您不打算更改地图,也不需要返回对地图的引用,因为Qt在大多数对象上使用了复制写入机制。这意味着如果构建QMap的副本,直到您真正改变了某些内容,则数据不会重复。 – humbagumba 2010-07-02 08:51:56

回答

1

我注意到你用

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

复制QMAP我假设你想利用对它的引用,即

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

如果你只需要一个参考到常量然后docs说,它是隐式共享,所以它不是什么大不了的。

如果这有助于您的问题,那么它必须与复制QMap有关。

编辑

因为这并没有帮助你的问题,我认为你需要检查被传递到registerPlugins指针appctx并检查它是否指向一个有效的对象。

+0

感谢您的答案,我使用您的方法,并将'pluginsMap'更改为一个指针(* pluginsMap)。但仍然是同样的问题。 – 2010-07-02 08:52:03

+0

@umanga:在这种情况下,你应该看看传递给'registerPlugins'的指针'appctx',并检查它是否指向一个有效的对象。它可能未初始化,指向已删除的内存,或以其他方式损坏。 – Troubadour 2010-07-02 08:57:30

+0

感谢Troubadour的提示。那是问题,它是未初始化的! – 2010-07-02 09:01:13