如何避免“java iteratorr not incrementable”错误

5627人阅读
VS使用(5)
最近使用C++,程序中使用了map容器,提示错误map/set iterator not dereferencable。
刚开始很是疑惑,迭代器未解除引用。。。
最后发现是迭代器指示的元素为空(即end),但程序在使用迭代器的循环中存在bug,以为现有条件足够约束而导致使用空的迭代器。
map&string, pair&double, double&&::iterator it = shotList.find
while (it-&first.find(string(&shot&) + id) != string::npos)
if (it-&second.first &= start && it-&second.second &= start||
it-&second.first &= end && it-&second.second &= end)
shotResultList.push_back(it-&first);
}正确的代码应该改为:
map&string, pair&double, double&&::iterator it = shotList.find
while (it != shotList.end() &&
it-&first.find(string(&shot&) + id) != string::npos)
if (it-&second.first &= start && it-&second.second &= start||
it-&second.first &= end && it-&second.second &= end)
shotResultList.push_back(it-&first);
}可以看出错误代码没有it != shotList.end()条件约束而导致错误。
再举个例子,加深对这种bug的印象:
提示如下:
#include &iostream&
#include &map&
int main()
map&int, int&
for (int i=0; i&10; ++i)
dict.insert(pair&int, int&(i, i));
map&int, int&::
for (it=dict.begin(); it!=dict.end(); ++it)
cout && &\t& && it-&first && & -& & && it-&second &&
// 出错代码
it = dict.end();
cout && it-&first &&
getchar();
错误提示如下:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:94198次
积分:1060
积分:1060
排名:千里之外
原创:28篇
评论:13条
(1)(2)(3)(3)(1)(2)(8)(2)(3)(2)(1)c++(126)
哇塞,今天这个问题弄了几个小时;
VC RichEdit删除可以用&SetWindowText(m_hWnd, L&&);
& & & & & & & & & & & & & & & & &&SendMessage(m_hWnd, WM_CLEAR, 0, 0);
这两个都可以,但是一用到这里程序就死掉了,用GetLastError() 提示错误5,拒绝访问;
原因:那就是你的内容没有释放,还在被使用中;有的内容是图文混排,其中的图片是需要用到OLE的,但是如果你没有完全释放或释放的不彻底,就会出现拒绝访问问题。
& & & & & &主要还是要看看,是否有指针没有被释放。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:469879次
积分:7056
积分:7056
排名:第2987名
原创:313篇
转载:28篇
评论:27条
(1)(4)(1)(1)(1)(2)(4)(1)(2)(7)(3)(5)(1)(6)(1)(2)(2)(2)(5)(4)(7)(5)(30)(1)(10)(11)(17)(11)(7)(20)(28)(5)(22)(1)(1)(16)(1)(14)(7)(1)(11)(16)(2)(5)(8)(18)(9)(2)(1)14672人阅读
程序设计(9)
&&&&&&& 最近加入了公司的一个移植项目,目标是把原来在PC平台上的程序放到360上运行。客户给的是PC上的代码和数据,编译过后就能够跑了。但是程序运行时,偶尔会报告错误。在VS2010启动的情况下,可以看到Debug游标停在对一个++Iterator的操作上。因为是调试版本,所以代码中额外添加了对Iterator的检查部分,具体信息是:”list iterator notincrementable”。
&&&&&&& 这个程序原本是在03,04年左右写的,结构还是比较清晰,模块划分也是清楚地按照功能进行,所以了解代码功能还是比较方便的。同时在程序代码中,大量运用了C++ STL模块,错误信息就是从这个部分发出来的:
for ( std::list&*&::iterator it =ObjList.begin(); it != ObjList.end(); ++it )
&&&&&& If((*it)-&regin == CheckRegin )
&&&&&&&&&&&&& ObjList.earse(it);
&&&&&&& 初看这部分代码,还没有看出错误端倪,感觉不是很正确的么:遍历list并删除目标的元素。后来实在没辄了,上网查了一下资料,才发现是代码在处理Iterator的earse的时候有点问题。当一个Container执行了一次earse操作之后,原来用来遍历的iterator就失效了,其行为是不可预测的,具体情况由实现决定。同时earse操作会返回一个指向container下一个元素的iterator,如果想继续遍历,就得用返回的iterator继续操作。
&&&&&& 所以针对上面的代码,如果只是删除遍历时候碰到的第一个符合条件的元素,那么在earse之后添加break,使得不再进行遍历。如果要继续操作,那么就得改成:
for ( std::list&*&::iterator it =ObjList.begin(); it != ObjList.end(); )
&&&&&& If((*it)-&regin == CheckRegin )
&&&&&&&&&&&&& it= ObjList.earse(it);
&&&&&& else
&&&&&&&&&&&&& ++
&&&&&& 如此,那个错误就不再出现了。
&&&&&& 之前也看过STL相关的一些资料,以为能用其基本功能了,但真的实践起来还是有不少细节需要注意的。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:59535次
排名:千里之外
原创:18篇
评论:14条
(2)(2)(3)(1)(1)(1)(1)(1)(1)(4)(2)14674人阅读
程序设计(9)
&&&&&&& 最近加入了公司的一个移植项目,目标是把原来在PC平台上的程序放到360上运行。客户给的是PC上的代码和数据,编译过后就能够跑了。但是程序运行时,偶尔会报告错误。在VS2010启动的情况下,可以看到Debug游标停在对一个++Iterator的操作上。因为是调试版本,所以代码中额外添加了对Iterator的检查部分,具体信息是:”list iterator notincrementable”。
&&&&&&& 这个程序原本是在03,04年左右写的,结构还是比较清晰,模块划分也是清楚地按照功能进行,所以了解代码功能还是比较方便的。同时在程序代码中,大量运用了C++ STL模块,错误信息就是从这个部分发出来的:
for ( std::list&*&::iterator it =ObjList.begin(); it != ObjList.end(); ++it )
&&&&&& If((*it)-&regin == CheckRegin )
&&&&&&&&&&&&& ObjList.earse(it);
&&&&&&& 初看这部分代码,还没有看出错误端倪,感觉不是很正确的么:遍历list并删除目标的元素。后来实在没辄了,上网查了一下资料,才发现是代码在处理Iterator的earse的时候有点问题。当一个Container执行了一次earse操作之后,原来用来遍历的iterator就失效了,其行为是不可预测的,具体情况由实现决定。同时earse操作会返回一个指向container下一个元素的iterator,如果想继续遍历,就得用返回的iterator继续操作。
&&&&&& 所以针对上面的代码,如果只是删除遍历时候碰到的第一个符合条件的元素,那么在earse之后添加break,使得不再进行遍历。如果要继续操作,那么就得改成:
for ( std::list&*&::iterator it =ObjList.begin(); it != ObjList.end(); )
&&&&&& If((*it)-&regin == CheckRegin )
&&&&&&&&&&&&& it= ObjList.earse(it);
&&&&&& else
&&&&&&&&&&&&& ++
&&&&&& 如此,那个错误就不再出现了。
&&&&&& 之前也看过STL相关的一些资料,以为能用其基本功能了,但真的实践起来还是有不少细节需要注意的。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:59537次
排名:千里之外
原创:18篇
评论:14条
(2)(2)(3)(1)(1)(1)(1)(1)(1)(4)(2)

我要回帖

更多关于 406错误 not accept 的文章

 

随机推荐