【发布时间】:2014-05-09 04:05:59
【问题描述】:
我正在使用 Visual Studio 2012。
我为这样的地图创建了一个类:
classA
{
private:
string a;
string b;
uint32_t start;
uint32_t end;
};
我定义了一个地图和一个这样的函数:
typedef std::map<uint32_t, classA, std::greater<uint32_t> > ClassAMap;
typedef ClassAMap::iterator ClassAMapIterator;
ClassAMap classAMap;
void lowerBoundTest(ClassAMap &classAMap)
{
uint32_t test = 0;
ClassAMapIterator it;
cin >> hex >> test;
it = classAMap.lower_bound(test);
cout << "lower_bound of " << test << ": "
<< it->first << endl;
}
然后我在取消引用地图的迭代器时收到此错误。
Debug Assertion Failed!
Program: C:\Windows\system32\MSVCP110D.dll
File: C:\program files (x86)\microsoft visual studio 11.0\vc\include\xtree
Line: 137
Expression: map/set iterator not dereferencable
For information on how your program can cause an assertion failure,
see the Visual C++ documentation on asserts.
(Press Retry to debug the application)
当我定义这样的地图时,我没有收到任何错误消息:
typedef std::map<uint32_t, classA> ClassAMap;
typedef ClassAMap::iterator ClassAMapIterator;
但我需要设置一个更大的函数。 我怎样才能摆脱这种断言失败?
【问题讨论】:
-
lower_bound可以返回end()的结果,你检查了吗? -
@MarkRansom 你应该回答这个问题。
-
其实我一开始加了 if (it != classAMap.begin() || it != classAMap.end()) ,然后修改 ||到 && 然后它工作正常。谢谢。
-
@RSahu 我很惊讶没有人提出这个观察结果。我已将其扩展为我认为非常完整的答案。
标签: visual-c++ map stl