c++ list的迭代器问题,求帮助

烟云觅渡 2016-12-31 08:21:00
Program: C:\windows\system32\MSVCP110D.dll
File: d:\visual studio 2012\vs安装文件\vc\include\list
Line: 210

Expression: list iterator not dereferencable

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.
下面是代码:
void EctractionOfTreeTrunk(list<Point> *SP,list<Point> *O,list<Point> *R,list<list<Point>> *trees,double *HT,double *VT,double *h1,double *h2) //SP是种子集,操作完这一步之后需要把种子集清空
{
double TreeHight(list<Point> l);
list<Point> Tree,N,Bush; //N用来收集不是treei的点
list<Point> lower_dmin3;
double dmin,dmin1,dmin2,dmin3,H;
Point n0;
for(list<Point>::iterator t=SP->begin();t!=SP->end();)
{
if(t->z>*h2)
{
O->push_back(*t);
t=SP->erase(t);
}
else
{
cout<<"Begin to create a new tree!"<<endl;
Tree.push_back(*t);
n0.Copy(t->insertn0());
N.push_back(n0);
for(list<Point>::iterator it=O->begin();it!=O->end();)
{
if(it->z<*VT)
{
dmin=it->TwoDistoTree(Tree); //这里的Tree是指当前的Tree
if(dmin<=*HT)
{
Tree.push_back(*it);
it=O->erase(it);
}
else
{
N.push_back(*it);
it++;
}
}
else
{
dmin1=it->TwoDistoTree(Tree);
if(dmin1<*HT)
{
dmin2=it->ThreeDistoTree(Tree);
for(list<Point>::iterator mm=N.begin();mm!=N.end();mm++)
{
if(mm->z<it->z)
lower_dmin3.push_back(*mm);
}
dmin3=it->ThreeDistoTree(lower_dmin3);
if(dmin2<dmin3)
{
Tree.push_back(*it);
it=O->erase(it);
}
else
{
R->push_back(*it);
it=O->erase(it);
}
}
else
{
it++;
N.push_back(*it);
}
}
}
cout<<"到此处完成了一棵树的分割."<<endl;
cout<<"当前树的大小:"<<Tree.size()<<endl;
cout<<"current O size:"<<O->size()<<endl;
H=TreeHight(Tree);
cout<<"当前树高:"<<H<<endl;
if(H<*h1) //h1是树干长度限制
{
for(list<Point>::iterator f=Tree.begin();f!=Tree.end();)
{
Bush.push_back(*f);
f=Tree.erase(f);
}
}
else //这里是H>*h1的情况。
{
trees->push_back(Tree);
Tree.clear();
N.clear();
}
t++;
cout<<"当前O的大小:"<<O->size()<<" 树集的大小"<<trees->size()<<endl;
cout<<"ConstructTree finished!!"<<endl;
}
}
if(!SP->empty()) SP->clear();
}
...全文
373 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-01-05
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
ri_aje 2017-01-05
  • 打赏
  • 举报
回复
挂了的时候看看调用栈,找自己的函数,看看挂在那句了,然后从那里再找 bug。
Yofoo 2017-01-04
  • 打赏
  • 举报
回复
出现异常去调试, 看callstack哪错了 应该是哪有访问越界了
烟云觅渡 2017-01-01
  • 打赏
  • 举报
回复
求大神帮助,要哭了。。。
烟云觅渡 2016-12-31
  • 打赏
  • 举报
回复
引用 8 楼 ipqtjmqj的回复:
[quote=引用 7 楼 sinat_21550679 的回复:] [quote=引用 5 楼 ipqtjmqj 的回复:] 那应该是你#include <list>这句前后的错误
这句前后的错误???????这整个程序都用的list,那这怎么办呢,大神,有解决办法吗?[/quote] 一般标准库不会有错误,除非你一不小心修改过。 由于编译器不够智能,就把错误把在标准库里[/quote] 没有修改过库
烟云觅渡 2016-12-31
  • 打赏
  • 举报
回复
引用 9 楼 xsklld的回复:
很可能是解引用了一个失效的迭代器。 好好检查代码,插入和删除元素都可能导致迭代器失效。
我这个程序总是前几次循环都正常,然后循环几次后就会突然蹦出来这个断言的,
xskxzr 2016-12-31
  • 打赏
  • 举报
回复
很可能是解引用了一个失效的迭代器。 好好检查代码,插入和删除元素都可能导致迭代器失效。
ipqtjmqj 2016-12-31
  • 打赏
  • 举报
回复
引用 7 楼 sinat_21550679 的回复:
[quote=引用 5 楼 ipqtjmqj 的回复:] 那应该是你#include <list>这句前后的错误
这句前后的错误???????这整个程序都用的list,那这怎么办呢,大神,有解决办法吗?[/quote] 一般标准库不会有错误,除非你一不小心修改过。 由于编译器不够智能,就把错误把在标准库里
烟云觅渡 2016-12-31
  • 打赏
  • 举报
回复
引用 5 楼 ipqtjmqj 的回复:
那应该是你#include <list>这句前后的错误
这句前后的错误???????这整个程序都用的list,那这怎么办呢,大神,有解决办法吗?
烟云觅渡 2016-12-31
  • 打赏
  • 举报
回复
引用 3 楼 ipqtjmqj 的回复:
line210对应你贴的代码的哪一行
double TreeHight(list<Point> l) //这里没有必要用减法,只需要用高度归一化之后的高度中的最大值算作树高 { list<Point>::iterator it=l.begin(); double Zmax=it->z,H; for(it;it!=l.end();it++) { if(Zmax<(it->z)) { Zmax=it->z; } } H=Zmax; return H; } 这是line210的代码。他们之间没关系
ipqtjmqj 2016-12-31
  • 打赏
  • 举报
回复
那应该是你#include <list>这句前后的错误
烟云觅渡 2016-12-31
  • 打赏
  • 举报
回复
引用 3 楼 ipqtjmqj的回复:
line210对应你贴的代码的哪一行
line210不在这个函数内部。应该不相关,它这个line210指的好像不是程序中的 line210
ipqtjmqj 2016-12-31
  • 打赏
  • 举报
回复
line210对应你贴的代码的哪一行
烟云觅渡 2016-12-31
  • 打赏
  • 举报
回复
烟云觅渡 2016-12-31
  • 打赏
  • 举报
回复
求大神帮助

64,635

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧