C++ QMap返回作为参考的问题?
大家好, 我有一个代码片段,如下所示:C++ QMap返回作为参考的问题?,c++,qt,reference,qmap,C++,Qt,Reference,Qmap,大家好, 我有一个代码片段,如下所示: class AppCtx { private: QMap<QString,IRzPlugin*> pluginsMap; public : void addPlugin(IRzPlugin *plugin) { pluginsMap.insert(plugin->getPluginUID(),plugin); } QMap<QString,IRzPlugin*> & getPlugins() {
class AppCtx {
private:
QMap<QString,IRzPlugin*> pluginsMap;
public :
void addPlugin(IRzPlugin *plugin)
{
pluginsMap.insert(plugin->getPluginUID(),plugin);
}
QMap<QString,IRzPlugin*> & getPlugins()
{
return pluginsMap;
}
}
类AppCtx{
私人:
QMap-pluginsMap;
公众:
void addPlugin(IRzPlugin*插件)
{
插入(plugin->getPluginUID(),plugin);
}
QMap&getPlugins()
{
返回pluginsMap;
}
}
在我的客户机代码中,我访问QMap如下。但应用程序中断
它访问“plugins.size()”的位置
class主窗口
.
.
{
无效注册表项列表(AppCtx*AppCtx)
{
QMap plugins=appctx->getPlugins();
qDebug(“插件数量%d”,plugins.size());//在此处中断
QList listPlugins=plugins.values();
对于(int i=0;isize;}
(gdb)返回
#QMap::size中的0 0x0000000000406ba1(此=0x405c2b)
at/opt/qtsdk-2010.02/qt/include/QtCore/qmap.h:178
#主窗口中的1 0x0000000000406736::registerPlugins(此=0x7fff0d7c98f0)
at/work/svn checkout/osaka3d/osaka3d/tags/iter07/prototype/osaka3d/rinzo/ui/mainwindow.cpp:23
}
有什么建议吗
提前感谢,,
umanga我注意到您正在使用
QMap<QString,IRzPlugin*> plugins=appctx->getPlugins();
QMap-plugins=appctx->getPlugins();
我想你想引用它,比如
QMap<QString,IRzPlugin*>& plugins=appctx->getPlugins();
QMap&plugins=appctx->getPlugins();
如果你只需要一个对const的引用,那么声明它是隐式共享的,所以这没什么大不了的
如果这有助于解决您的问题,那么它必须与复制QMap
有关
编辑
由于这对您的问题没有帮助,我认为您需要检查传递到
registerPlugins
的指针appctx
,并检查它是否指向有效对象。我注意到您正在使用
QMap<QString,IRzPlugin*> plugins=appctx->getPlugins();
QMap-plugins=appctx->getPlugins();
我想你想引用它,比如
QMap<QString,IRzPlugin*>& plugins=appctx->getPlugins();
QMap&plugins=appctx->getPlugins();
如果你只需要一个对const的引用,那么声明它是隐式共享的,所以这没什么大不了的
如果这有助于解决您的问题,那么它必须与复制QMap
有关
编辑
由于这对您的问题没有帮助,我认为您需要检查传递到
registerPlugins
的指针appctx
,并检查它是否指向有效对象。如果您不打算更改映射,也不必返回对映射的引用,因为Qt对大多数对象使用写时复制机制。这意味着,在您实际更改某些内容之前,如果构造是QMap的副本,则数据不会重复。如果您不打算更改映射,则也无需返回对映射的引用,因为Qt对大多数对象使用写入时复制机制。这意味着,如果构造是QMap的副本,则数据不会重复,直到您实际上改变了一些东西。谢谢你的回答,我用你的方法把“pluginsMap”变成了指针(*pluginsMap)。但仍然是同一个问题。@umanga:在这种情况下,您应该查看传递到registerPlugins
的指针appctx
,并检查它是否指向有效的对象。它可能未初始化,指向已删除的内存,或者以其他方式损坏。感谢Troubador提供的提示。这就是问题所在,它是未初始化的已初始化!感谢您的回答,我使用您的方法将“pluginsMap”更改为指针(*pluginsMap)。但仍然是同一个问题。@umanga:在这种情况下,您应该查看传递到registerPlugins
的指针appctx
,并检查它是否指向有效的对象。它可能未初始化,指向已删除的内存,或者以其他方式损坏。感谢Troubador提供的提示。这就是问题所在,它是未初始化的初始化!