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


}

有什么建议吗?

提前致谢, 乌漫画

最佳答案

我注意到你正在复制 QMap

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

我假设您想引用它,即

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

如果你只需要一个常量引用那么docs说它是隐式共享的,所以没什么大不了的。

如果这对您的问题有帮助,那么它一定与复制 QMap 有关。

编辑

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

关于c++ - QMap 返回作为引用有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3164237/

相关文章:

c# - 在 C# 中使用转换后的指针值的引用返回可以吗?

c++ - 如何使用 opencv 和 c++ 减去形状

performance - 为什么创建动态 qml 对象这么慢,有哪些合理的替代方案?

c++ - 特定子类的装饰器

qt - 如何设置应用信息

c++ - 当 Qt Slot 位于通过 std::async 创建的线程上时,它不会被调用

reference - 如何在不检查 sy-subrc 的情况下创建有效引用?

c++ - 这似乎是 clang++ 编译器中的一个错误

c++ - 如何在 Windows Qt 应用程序中嵌入 Qt 库?

c++ - 是否可以将一段内存标记为 "out of bounds",以便堆管理器不从中分配内存?