【问题标题】:.value() called from iterator causes an Appcrash从迭代器调用的 .value() 会导致 Appcrash
【发布时间】:2013-06-06 22:18:32
【问题描述】:

我有以下代码,我想在 QMap 中找到与等于“tagName”的键关联的值。 一旦我将迭代器定位在正确的位置,我想获取这个值(应该是 QStrings 的 QVector),看看我是否能在其中找到我想要的。

但是每当我尝试执行 p.value() 时,我的程序就会崩溃。 我检查了我的调试器,奇怪的是 p 的键和值在调试面板中显示为“不可访问”...

QMap<QString, QVector<QString> >::iterator p = associations.find(tagName);

int index = p.value().indexOf(noteName);

return (index != -1);

任何帮助或提示将不胜感激!

【问题讨论】:

  • 您应该首先检查迭代器是否有效,即您是否在地图中找到了东西。
  • if ( p == associations.end() ) return;.
  • 永远,永远,永远写if (bool_expr) return true; else return false;。它与return bool_expr; 相同,只是更长。
  • @MarceloCantos 是的,对不起,我很累,否则我会注意到的,现在很惭愧!
  • @Selphira:别出汗。阅读六个月前写的代码时,我偶尔会抓狂。

标签: c++ qt


【解决方案1】:

在取消引用之前检查迭代器是否有效,即是否在地图中找到了一些东西:

return p != associations.end() && p.value().indexOf(noteName) != -1;

【讨论】:

  • 是的,谢谢,这确实阻止了程序崩溃,所以现在我面临另一个问题:我的变量关联(我的 QMap)确实包含对应于 tagName 的键/值对键(我在调试时已经检查过)那么为什么“查找”调用似乎找不到它?
  • @Selphira 这基本上是不可能的,所以您还有另一个问题,我们在您发布的代码中看不到。
  • @juanchopanzaz 好吧,我真的错了,你是对的。你的评论让我想多了,结果我认为作为参数传递的(我的 tagName)并不是我想象的那样。我在错误的地方寻找我的错误。无论如何,这个答案和所有的 cmets 让我解决了我的问题,所以谢谢!
猜你喜欢
  • 2012-10-14
  • 1970-01-01
  • 2017-04-01
  • 1970-01-01
  • 2015-05-16
  • 2011-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多