自上一篇《区域填充之扫描线算法》只是简单的实现了区域填充,但后来我在上实验课时再次运行却有点问题,询问老师,老师说是内存溢出。所以我就继续优化了下,主要在于AET的更新。以及创建的ET表
代码具体如下:
//---------------------------------------------------------------------------------------
//扫描线填充算法的改进(对于AET的更新)
void regionfill2(HDC hdc,Point1 *p,int len,int ymin,int ymax)
{
EdgeTable ET(ymax-ymin+1);
//创建ET表
ET.createTableEdge(p,len,ymin,ymax);
LList<Edge>* AET=new LList<Edge>();
LList<Edge>* tempAET;
Edge curr,temp;
for(int i=0;i<=(ymax-ymin+1);i++)
{
if(!ET.isEmptyInLine(i))
{
tempAET=ET.getValue(i);
for(tempAET->setStart();tempAET->getValue(curr);tempAET->next())
AET->sortInsert(curr);
tempAET->clear();
}
//两两配对填充
for(AET->setStart();AET->getValue(curr);AET->next())
{
AET->next();
AET->getValue(temp);
for(int x0=int(curr.x);x0<=temp.x;x0++)
SetPixel(hdc,x0,i+ymin,255);
//如果AET表中某记录的ymax=扫描线y,则删除该记录
if(curr.ymax==i)
AET->Delete(curr);
if(temp.ymax==i)
AET->Delete(curr);
}
//在AET表中的每个记录 对x进行修改
for(AET->setStart();AET->getValue(curr);AET->next())
{
curr.x+=curr.increment;
//tempAET=new LList<Edge>();
tempAET->sortInsert(curr);
}
//为何到此处运行结束?????
AET->clear();
for(tempAET->setStart();tempAET->getValue(curr);tempAET->next())
{
AET->append(curr);
}
}
}
这里对于顶点的保存其实用向量更为恰当。其他地方的略微更改,这里不列出了。但通过调试,却出现了一个匪夷所思的问题:即上面代码有处注释所示运行到该处就提示:test2.exe 中的 0x0125611f 处最可能的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突。
上网查了下,有人说是浏览器360的问题,有的说是qq的问题。还有的说是VS2010的BUG。搞得我也不知道哪出错了,我认为内存应该没泄露的,因为这次比上一篇的内存开销明显减少。所以我也倾向认为是VS2010的BUG。但不确定,所以若有知道的指点下。以及该如何进行修改?
介于程序未能运行成功,所以没上传代码。若有兴趣的可以联系本人获取完整代码以及一起讨论下此问题。