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. linux测试带宽命令,Linux服务器网络带宽测试iperf

    linux测试带宽命令,Linux服务器网络带宽测试iperf必须先运行iperf serveriperf -s -i 2客户端iperf -c 服务端IP地址 iperf原理解析 iperf工具可以 ...

  2. ubuntu14.04无法安装Curl,需要先升级sudo apt-get update

    ubuntu14.04无法安装Curl,需要先升级sudo apt-get updatesudo apt-get updatesudo apt-get install curl------------ ...

  3. web前端----JavaScript(JS)函数

    函数 函数定义 JavaScript中的函数和Python中的非常类似,只是定义方式有点区别. // 普通函数定义 function f1() { console.log("Hello wo ...

  4. Linux系统下(x64)安装jdk 1.6(jdk-6u45-linux-x64.bin)

    Linux系统下(x64)安装jdk 1.6(jdk-6u45-linux-x64.bin) 一,查看是否安装jdk: # rpm -qa | grep jdk 或者 #rpm -q jdk 或者 # ...

  5. 20145335郝昊《网络攻防》Exp4 Adobe阅读器漏洞攻击

    20145335郝昊<网络攻防>Exp4 Adobe阅读器漏洞攻击 实验内容 初步掌握平台matesploit的使用 有了初步完成渗透操作的思路 本次攻击对象为:windows xp sp ...

  6. CodeForces 471D MUH and Cube Walls -KMP

    Polar bears Menshykov and Uslada from the zoo of St. Petersburg and elephant Horace from the zoo of ...

  7. C#中基于流的XML文件操作笔记

    System.Xml.XmlReader和System.Xml.XmlWriters是两个抽象类,XmlReader提供了对于XML数据的快速,非缓存,只进模式的读取器,XmlWriter表示一个编写 ...

  8. P2709 小B的询问

    题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重 ...

  9. POJ 3468 A Simple Problem with Integers(线段树&区间更新)题解

    Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...

  10. Ubuntu 登陆界面无限循环问题 以及 root用户无法使用命令问题

    在Ubuntu下配置好了eclipse之后,马上着手用eclipse试运行ns3.在./waf编译的时候出现了"Permission denied"问题. 在网络上查阅了相关资料之 ...