2010-07-02 39 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