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问题的更多相关文章

  1. BUG_vector iterator not dereferencable

    1问题: bug提示图下图所示:

  2. C++ STL之迭代器注意事项

    1.两个迭代器组成的区间是前闭后开的 2.如果迭代器的有效性,如果迭代器所指向的元素已经被删除,那么迭代器会失效 http://blog.csdn.net/hsujouchen/article/det ...

  3. program files (x86)\microsoft visual studio 14.0\vc\include\xtree,如果没有找到,下标溢出了,就报错咯

    ---------------------------Microsoft Visual C++ Runtime Library---------------------------Debug Asse ...

  4. 学习笔记-C++ STL iterator与对指针的理解-20170618

    vector的itrerator支持random access #include<iostream> #include<vector> using namespace std; ...

  5. 设计模式(十):从电影院中认识"迭代器模式"(Iterator Pattern)

    上篇博客我们从醋溜土豆丝与清炒苦瓜中认识了“模板方法模式”,那么在今天这篇博客中我们要从电影院中来认识"迭代器模式"(Iterator Pattern).“迭代器模式”顾名思义就是 ...

  6. 用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。

    最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变 ...

  7. [LeetCode] Flatten Nested List Iterator 压平嵌套链表迭代器

    Given a nested list of integers, implement an iterator to flatten it. Each element is either an inte ...

  8. [LeetCode] Peeking Iterator 顶端迭代器

    Given an Iterator class interface with methods: next() and hasNext(), design and implement a Peeking ...

  9. [LeetCode] Zigzag Iterator 之字形迭代器

    Given two 1d vectors, implement an iterator to return their elements alternately. For example, given ...

随机推荐

  1. pdf2swf 中文乱码问题

    准备资料: 1.xpdfbin-win-3.03.zip.xpdf-chinese-simplified.tar.gz 下载地址:http://www.foolabs.com/xpdf/downloa ...

  2. Non-resolvable parent POM

    今天导入公司项目,maven聚合项目,但是项目目录结构不正确,内层的项目的parent不是外层项目,这个......有点无语,结果导入直接报错.同事说,我们导入是好好的啊,原来他们用的是eclipse ...

  3. adb shell 命令详解,android, adb logcat

    http://www.miui.com/article-275-1.html http://noobjava.iteye.com/blog/1914348 adb shell 命令详解,android ...

  4. 利用Python网络爬虫爬取学校官网十条标题

    利用Python网络爬虫爬取学校官网十条标题 案例代码: # __author : "J" # date : 2018-03-06 # 导入需要用到的库文件 import urll ...

  5. 09: xmltodict 模块将xml格式转成json格式

    1.1 : xmltodict 模块将xml格式转成json格式 <?xml version="1.0"?> <!--#版本号--> <data> ...

  6. 20145329 《网络对抗技术》Web安全基础实践

    实践的目标 理解常用网络攻击技术的基本原理.Webgoat实践下相关实验:SQL注入攻击.XSS攻击.CSRF攻击. 实验后回答问题 (1)SQL注入攻击原理,如何防御 攻击原理 SQL注入即是指we ...

  7. Duilib初级控件扩展一例: 具有鼠标滚动消息的OptionUI

    转载:http://www.cnblogs.com/memset/p/Duilib_MouseWheelOptionUI_Deprecated.html

  8. linux交叉编译gcc4.8.3

    1.环境: Ubuntu 16.04 2.获取 wget mirrors.ustc.edu.cn/gnu/gcc/gcc-4.8.3/gcc-4.8.3.tar.bz2 3.解压 tar xvf gc ...

  9. Python time strptime()与time strftime()

    time strftime()接收时间元组,返回表示时间的字符串. time strptime()把时间字符串,解析成一个时间元组. import time t = time.strftime('%Y ...

  10. vs2010中自动给函数或者类加上注释宏模板

    Sub AddFunComment() Dim DocSel As EnvDTE.TextSelection DocSel = DTE.ActiveDocument.Selection DocSel. ...