iterator not dereferencable问题
STL中的迭代器总是出现各种问题,这个是我在打表达式求值时碰到的...
综合网上的答案,一般来说有两种情况:
第一:访问了非法位置。
一般来说可能在queue为空时取front(),rear(),或者用list时误访最后一个结点,再或是在stack为空时进行了top(),pop()操作等。
一般来说用一下方法解决即可:
(1)在访问链表元素时判断当前迭代器是否指向链表尾
list<Boom*>::iterator ite=m_listBoom.begin();
while(ite!=m_listBoom.end())
{
(*ite)->BoomShow(hdc);
if(ite==m_listBoom.end())
6 {
7 return ;
8 }
ite++;
}
这是一段想对图片进行展示的代码,正常情况下红字部分我们是没有必要加的,但当你多次运行该程序时很可能会报错,错误为:list iterator not dereferencable
原因就是误访了尾节点。
(2)栈:
以下是表达式求值的部分代码(把中缀转后缀部分)
我在注释出刚开始是把!s1.empty()的判断放在后面的,于是就不停的报错...是不是很熟悉?
原因其实很简单,我们都知道在top(),pop()操作之前都要先判断栈是否为空
而又因为&&的短路原则,如果栈为空,则&&前面的表达式值为0,不会走后面对top()进行操作的代码,避免了错误

#include<iostream>
#include<string.h>
#include<stack>
using namespace std;
stack<char>s1;
stack<int>s2;
char str[];
int num[];
int prior(char c)
{
if(c==')'||c=='(') return ;
else if(c=='+'||c=='-') return ;
else if(c=='*'||c=='/') return ;
}
void getLast(int n)
{
int i=;
char tmp;
for(i=;i<n;i++)
{
if(str[i]>=''&&str[i]<='')
{
s2.push(str[i]);
if(str[i+]>=''&&str[i+]<='')
{ }
else
{
s2.push('#');
}
}
else
{
if(s1.empty()||prior(str[i])>prior(s1.top())||str[i]=='('/*||!s1.empty()*/)
{
s1.push(str[i]);
}
else if(!s1.empty()&&str[i]==')')
{
while(!s1.empty()&&(s1.top())!='(')
{
tmp=s1.top();
s2.push(tmp);
s1.pop();
}
s1.pop();
}
else
{
while(!s1.empty()&&(prior(str[i])<=prior(s1.top())))//注意短路原则,要先判断是否为空为空自然不走后面的代码
{ //如果把判断是否为空放优先级判断之后,就会出现栈为空却
tmp=s1.top(); //试图进行top(),pop()操作的情况
s1.pop(); //会出现错误deque iterator not dereferencable
s2.push(tmp); //!所以要把s1.empty的判断放前面
}
s1.push(str[i]); }
}
}
while(!s1.empty())
{
tmp=s1.top();
s1.pop();
s2.push(tmp);
}
}
int cal(int n)
{
return ;
}
int main()
{
int n,i;
scanf("%s",&str); n=strlen(str);
char tmp;
getLast(n);
while(!s2.empty())
{
tmp=s2.top();
s2.pop();
printf("%c",tmp);
}
return ;
}
第二:多线程编程
在多线程编程里面,这种问题也出现的比较多。
两个线程同时访问同一个容器,也会导致出现这种情况。
解决办法:关键代码段。
不建议用互斥内核对象是因为关键代码段是用户层的,调用很快,互斥内核对象调用需要从用户态转入内核态!时间很长!
参考资料:http://blog.csdn.net/midle110/article/details/823858
iterator not dereferencable问题的更多相关文章
- BUG_vector iterator not dereferencable
1问题: bug提示图下图所示:
- C++ STL之迭代器注意事项
1.两个迭代器组成的区间是前闭后开的 2.如果迭代器的有效性,如果迭代器所指向的元素已经被删除,那么迭代器会失效 http://blog.csdn.net/hsujouchen/article/det ...
- program files (x86)\microsoft visual studio 14.0\vc\include\xtree,如果没有找到,下标溢出了,就报错咯
---------------------------Microsoft Visual C++ Runtime Library---------------------------Debug Asse ...
- 学习笔记-C++ STL iterator与对指针的理解-20170618
vector的itrerator支持random access #include<iostream> #include<vector> using namespace std; ...
- 设计模式(十):从电影院中认识"迭代器模式"(Iterator Pattern)
上篇博客我们从醋溜土豆丝与清炒苦瓜中认识了“模板方法模式”,那么在今天这篇博客中我们要从电影院中来认识"迭代器模式"(Iterator Pattern).“迭代器模式”顾名思义就是 ...
- 用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。
最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变 ...
- [LeetCode] Flatten Nested List Iterator 压平嵌套链表迭代器
Given a nested list of integers, implement an iterator to flatten it. Each element is either an inte ...
- [LeetCode] Peeking Iterator 顶端迭代器
Given an Iterator class interface with methods: next() and hasNext(), design and implement a Peeking ...
- [LeetCode] Zigzag Iterator 之字形迭代器
Given two 1d vectors, implement an iterator to return their elements alternately. For example, given ...
随机推荐
- TED #10# A rite of passage for late life
Bob Stein: A rite of passage for late life Collection I grew up white, secular and middle class in 1 ...
- P3810 【模板】三维偏序(陌上花开)
P3810 [模板]三维偏序(陌上花开) cdq分治+树状数组 三维偏序模板题 前两维用cdq分治,第三维用树状数组进行维护 就像用树状数组搞逆序对那样做--->存权值的出现次数 attenti ...
- 开源项目托管GitHub
工具:本地HelloWorld源项目 msysgit(Windows) 实验步骤:一.在GitHub新建托管项目 在http://github.com注册账号20159214-sunnan. 完成注册 ...
- C简介与环境配置
C 语言是一种通用的高级语言,最初是由丹尼斯·里奇在贝尔实验室为开发 UNIX 操作系统而设计的.C 语言最开始是于 1972 年在 DEC PDP-11 计算机上被首次实现. 在 1978 年,布莱 ...
- BZOJ 5424: 烧桥计划
BZOJ 5424: 烧桥计划 目前暂居rk1QAQ 首先,设\(f[i][k]\)为前i个点中,选了第i个点,总共选了k个点的答案.那么就有: \[f[i][k]=min_{j<i}\{f[j ...
- [BZOJ1103][POI2007]大都市meg dfs序+树状数组
Description 在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也开始骑着摩托车传递邮件了.不过,她经常回忆起以前在乡间漫步的情景.昔日,乡下有依次编号为1..n ...
- mysql时间格式化函数日期格式h和H区别
本文为博主原创,未经允许不得转载: 今天碰到一个问题,发现项目中有一个统计图的数据和时间格式没有对应准确,统计图要描述的是操作次数和操作时间的关系, 但很奇怪的是操作次数对应的时间却是凌晨,实际应用中 ...
- Future Works on P4
Future Works on P4 P4 and NV: MPvisor, Hyper4, HyperV, Flex4 P4 and NFV P4 and Network Cache P4 and ...
- 51nod 1243 排船的问题(二分)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1243 题意: 思路: 二分来做,每次贪心的把船安排到能安排的最左边即可. ...
- 【BZOJ】4012: [HNOI2015]开店
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4012 给出一个$n$个点的树,树上每一个点都有一个值$age$,每条边都有边权,每次查询一 ...