以下程序会倒致Stack overflow 为什么?请高手指点

XueBoy163 2005-06-22 11:40:39
// Farm Irrigation.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "iostream"
#include "fstream"
#include "vector"
#include "string"

using namespace std;

int M,N;

vector<void*> table;
class block
{
//mark
// 1
//0 2
// 3
// that type a means 01
// b means 12
// c means 23 and so...
public:
int m_id;
block *l;
block *r;
block *u;
block *d;
string pip;

block(char ch,int id)
{
l = NULL;
r = NULL;
u = NULL;
d = NULL;
m_id = id;
construct(ch);
}
int construct(char ch)
{
switch(ch)
{
case 'A':
pip = "01";
break;
case 'B':
pip = "12";
break;
case 'C':
pip = "03";
break;
case 'D':
pip = "02";
break;
case 'E' :
pip = "13";
break;
case 'F':
pip = "02";
break;
case 'G':
pip = "012";
break;
case 'H':
pip = "301";
break;
case 'I':
pip = "230";
break;
case 'J':
pip = "123";
break;
case 'K':
pip = "0123";
break;
}
bool mark = false;
return 0;

}
~block()
{


if(l)
delete l;

if(r)
delete r;
if(u)
delete u;
if(d)
delete d;
table[m_id] = NULL;


}

};

block* get_left(int id);
block* get_top(int id);



bool insert(char ch,int id);

int main(int argc, char* argv[])
{

ifstream fin("input.txt");
while(fin >> M>> N)
{
if( M == -1 || N == -1)
break;
char ch;
block *p;
table.clear();
for( int i = 0 ; i < M*N-1; i++)
{
int id = i;
fin >> ch;
p = new block(ch,i);
table.push_back(p);
if(((block*)table[id])->pip.find('0') != string::npos)
{
p = get_left(id);
if(p && (p->pip.find('2') != string::npos))
{
p->r = (block*)table[id];
((block*)table[id])->l = p;
}
}
if( ((block*)table[id])->pip.find('1') != string::npos)
{
p = get_top(id);
if(p && (p->pip.find('3') != string::npos))
{
p->d = (block*)table[id];
((block*)table[id])->u = p;
}
}
}
int c = 0;
for(vector<block*>::iterator iter = (block**)table.begin(); iter != (block**)table.end(); iter ++)
{
if(*iter)
{
c++;
delete ((block*)*iter);
}
}
cout << c;
}
return 0;
}
bool insert(char ch,int id)
{
block *p;
if(((block*)table[id])->pip.find('0') != string::npos)
{
p = get_left(id);
if(p && (p->pip.find('2') != string::npos))
{
p->r = (block*)table[id];
((block*)table[id])->l = p;
}
}
if( ((block*)table[id])->pip.find('1') != string::npos)
{
p = get_top(id);
if(p && (p->pip.find('3') != string::npos))
{
p->d = (block*)table[id];
((block*)table[id])->u = p;
}
}
return true;

}
block* get_top(int id)
{
if( id+1 > N)
{
id -= N;
}
return (block*)table[id];
}
block* get_left(int id)
{
if( (id)%N >0)
id --;
else
return NULL;
return (block*)table[id];
}

******************************************测试数据如下:******************************
2 2
DK
HF

3 3
ADC
FJK
IHE

-1 -1
...全文
161 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
mostideal 2005-06-22
  • 打赏
  • 举报
回复
楼上的分析有理。。。学习。。
晨星 2005-06-22
  • 打赏
  • 举报
回复
“delete”的作用就是先调用析构函数,然后释放内存。
你在block类的析构函数中,对l,r,u,d进行delete操作,而你的l,r,u,d又都是block类型的,于是在析构函数中,对他们进行delete便又导致了block类的析构函数的调用,你在block类的析构函数中,对l,r,u,d进行delete操作,而你的l,r,u,d又都是block类型的,于是在析构函数中,对他们进行delete便又导致了block类的析构函数的调用,你在block类的析构函数中,对l,r,u,d进行delete操作,而你的l,r,u,d又都是block类型的,于是在析构函数中,对他们进行delete便又导致了block类的析构函数的调用,你在block类的析构函数中,对l,r,u,d进行delete操作,而你的l,r,u,d又都是block类型的,于是在析构函数中,对他们进行delete便又导致了block类的析构函数的调用,…………

如此递归不止。。。

XueBoy163 2005-06-22
  • 打赏
  • 举报
回复
好像发生在~block()里的,但不知为什么?
oyljerry 2005-06-22
  • 打赏
  • 举报
回复
仔细调试一下
_老草_ 2005-06-22
  • 打赏
  • 举报
回复
递归的结束条件?
beyondtkl 2005-06-22
  • 打赏
  • 举报
回复
是哦 死循环 无限递归 之类的。。。

看看你的 递归返回的 判断条件
晨星 2005-06-22
  • 打赏
  • 举报
回复
单步跟踪一下,看看是否哪里导致了无限递归。

64,671

社区成员

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

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