析构函数里delete的问题
时间:2008-05-09 19:06:51
来源:论坛整理 作者: 编辑:chinaitzhe
using namespace std;
//建立停车场类
class ParkingLot
{
private:
int num;
int max_size;
int base;
int top;
ParkingLot *car;
public:
ParkingLot(){}
//建立一个最大容量为n的停车场栈
ParkingLot(int n)
{
max_size=n;
car=new ParkingLot[max_size 1];
base=0;
top=0;
}
//空则返回1,否则返回0
int PL_empty()
{
if(base==top)
return 1;
else
return 0;
}
//满则返回1,否则返回0
int PL_full(){
if(top-base==max_size)
return 1;
else
return 0;
}
//返回当前停车场内车辆数
int PL_length()
{
return top-base;
}
//取出第一辆车,将车牌号给e
int PopTop(int &e)
{
if(base==top)
cout < <"停车场中无该车\n";
else
{
e=car[top-1].num;
top--;
}
return e;
}
//当停车场不满时,存入新车
void Push(int e)
{
if(top==max_size)
cout < <"停车场已满请排队等候\n";
else
{
car[top].num=e;
top ;
}
}
};
//建立车队类
class queue
{
private:
int element;
queue *front;
queue *rear;
queue *rlink;
public:
//构造函数新建一个空的队列
queue(){}
queue(int n)//此处参数n只是为了区分两个构造函数
{
front=new queue;
//front=first;
rear=front;
//cout < <"构造成功\n";
}
//析构函数销毁一个队列
~queue()
{
queue *p;
while(front!=rear)
{
p=front->rlink;
delete front;
front=p;
}
delete front; //不明白! 为什么加上这一部会出错误
}
//清空队列
int clearQueue()
{
front=rear;
return 1;
}
//若队列为空返回1,否则返回0
int QueueEmpty()
{
if(front==rear)
return 1;
else
return 0;
}
//返回队列的长度
int QueueLength()
{
int i=0;
queue *p=front;
while(rear!=p)
{
i ;
p=p->rlink;
}
return i;
}
//用e返回队列顶元素
void GetHead(int &e)
{
if(front!=rear)
e=front->rlink->element;
else
cout < <"队列为空\n";
}
//插入新的元素e为队列头元素
void EnQueue(int e)
{
queue *p=new queue;
if(QueueEmpty())
{
p->element=e;
rear=p;
front->rlink=rear;
}
else
{
p->element=e;
rear->rlink=p;
rear=p;
}
}
//若队列不为空删除队列头元素用e返回
void DeQueue(int &e)
{
queue *p=front->rlink;
if(QueueEmpty())
cout < <"队列为空\n";
else
{
e=p->element;
delete front;
front=p;
}
}
};
//存车的函数
void cunche(ParkingLot &a,queue &b)
{
int num;
cout < <"登记车牌请您输入:";
cin>>num;
if(!a.PL_full())
{
a.Push(num);
cout < <"车牌号为" < <num < <"的车成功存入停车场\n";
}
else
{
b.EnQueue(num);
cout < <"停车场已满,车牌号为" < <num < <"的车进入队列排队等候中,排在第" < <b.QueueLength() < <"位\n";
}
}
//取车的函数
void quche(ParkingLot &a,queue &b,ParkingLot &c)
{
int num;
int e;
if(a.PL_empty())
cout < <"停车场为空\n";
else
{
cout < <"请输入您要取的车的牌号:";
cin>>num;
a.PopTop(e);
while(e!=num)
{
c.Push(e);
if(a.PL_empty())
{
cout < <"停车场内无该车,请重新选择输入\n";
break;
}
a.PopTop(e);
}
if(e==num)
cout < <"车牌号为" < <num < <"的车成功从停车场取出\n";
while(!c.PL_empty())
{
c.PopTop(e);
a.Push(e);
}
if(!b.QueueEmpty()&&!a.PL_full())
{
b.DeQueue(e);
a.Push(e);
cout < <"车牌号为" < <e < <"的车成功存入停车场\n";
}
if(b.QueueEmpty())
cout < <"无车排队等候\n";
}
}
void main()
{
int n;
cout < <"输入停车场的最大容车辆数:\n";
cin>>n;
ParkingLot A(n);
ParkingLot C(n);//暂时存放退出的车
queue B(1);
int choice;
l1:
cout < <"欢迎光临,存车按1,取车按2,结束程序3:";
cin>>choice;
switch(choice)
{
case 1:cunche(A,B);break;
case 2:quche(A,B,C);break;
case 3:exit(0);
default:cout < <"输入有误\n";
}
goto l1;
}
///////////////////////////////////////////////////////////////
~queue()
{
queue *p;
while(front!=rear)
{
p=front->rlink;
delete front;
front=p;
}
delete front; //不明白! 为什么加上这一部会出错误
//////////////////////////////////////////////////////////
网友回复:jf
网友回复:~queue()
{
queue *p;
while(front!=rear)
{
p=front->rlink;
delete front;
front=p;
}
delete front; //不明白! 为什么加上这一部会出错误
你是想实现像智能指针那样的功能吗?你在哪里加的不行?
网友回复:
- C/C code
Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ ~queue() { queue *p; while(front!=rear) { p=front->rlink; delete front; //这里会对front调用~queue(),然后递归下去 front=p; } delete front; //这里会对front调用~queue(),然后递归下去 }
网友回复:ding
网友回复:up
网友回复:析构函数里不要delete自已的类型,不然会崩的。
网友回复:
谁说不能?
怕是你做递归时,堆栈出错吧。
网友回复:
试下这个,也许你能找到答案
~queue()
{
queue *p;
queue **tmp;
while(front!=rear)
{
p=front->rlink;
*tmp = &front;
delete front;
tmp = NULL;
front=p;
}
if (front !!= NULL)
delete front; //也许就不会出错了。
网友回复:
~queue()
{
queue *p;
queue **tmp;
while(front!=rear)
{
p=front->rlink;
tmp = &front;//应该是这样
delete front;
*tmp = NULL;//应该是这样
front=p;
}
if (f…
网友回复:加个判定就不会错了
网友回复:析构函数不能对delete本类。不然产生内存异常。
网友回复:析构时出现了递归.....
网友回复:还是不行... 怎么办?
网友回复:delete front;
网友回复:真的吗? 哪里有讲过
网友回复:下次发帖把错误信息 也跟上吧,呵呵
网友回复:
- C/C code
Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ //你用一个队列来模拟停车场本身是不合理的 //无法完成按车牌号的取出,所以下面的程序只能存车 #include <iostream> using namespace std; //建立停车场类 class ParkingLot { private: int num; int max_size; int base; int top; int cnt; int *car; public: ParkingLot(){} //建立一个最大容量为n的停车场栈 ParkingLot(int n) { max_size=n; car=new int[max_size]; base=0; top=0; cnt=0; } //空则返回1,否则返回0 int PL_empty() { return cnt == 0; } //满则返回1,否则返回0 int PL_full() { return cnt == max_size; } //返回当前停车场内车辆数 int PL_length() { return cnt; } //取出第一辆车,将车牌号给e int PopTop(int &e) { if(PL_empty()) { cout <<"停车场中无该车\n"; } else { top = (top - 1 max_size) % max_size; e=car[top]; --cnt; } return e; } //当停车场不满时,存入新车 void Push(int e) { if(PL_full()) { cout <<"停车场已满请排队等候\n"; } else { car[top]=e; top = (top 1)%max_size; cnt; } } }; //建立车队类 class queue { private: int element; queue *front; queue *rear; queue *rlink; public: //构造函数新建一个空的队列 queue(){} queue(int n)//此处参数n只是为了区分两个构造函数 { front=new queue; //front=first; rear=front; rear->rear = front; //cout <<"构造成功\n"; } //析构函数销毁一个队列 ~queue() { queue *p=front; while(p!=rear) { queue* t = p; p = p->rlink; delete t; } delete p; //不明白! 为什么加上这一部会出错误 } //清空队列 int clearQueue() { queue *p=front; while(p!=rear) { queue* t = p; p = p->rlink; delete t; } front = rear; rear->rear = front; return 1; } //若队列为空返回1,否则返回0 int QueueEmpty() { return front==rear; } //返回队列的长度 int QueueLength() { int i=0; queue *p=front; while(rear!=p) { i ; p=p->rlink; } return i; } //用e返回队列顶元素 void GetHead(int &e) { if(front!=rear) { e = front->rlink->element; } else { cout <<"队列为空\n"; } } //插入新的元素e为队列头元素 void EnQueue(int e) { queue *p=new queue; p->element=e; p->rlink = rear->rlink; rear->rlink=p; rear=p; } //若队列不为空删除队列头元素用e返回 void DeQueue(int &e) { if(front!=rear) { queue* t = front; front = t->rlink; e=t->rlink->element; delete t; rear->rlink = front; } else { cout <<"队列为空\n"; } } }; //存车的函数 void cunche(ParkingLot &a,queue &b) { int num; cout <<"登记车牌请您输入:"; cin>>num; if(!a.PL_full()) { a.Push(num); cout <<"车牌号为" <<num <<"的车成功存入停车场\n"; } else { b.EnQueue(num); cout <<"停车场已满,车牌号为" <<num <<"的车进入队列排队等候中,排在第" <<b.QueueLength() <<"位\n"; } } //取车的函数 void quche(ParkingLot &a,queue &b,ParkingLot &c) { int num; int e; if(a.PL_empty()) cout <<"停车场为空\n"; else { cout <<"请输入您要取的车的牌号:"; cin>>num; a.PopTop(e); while(e!=num) { c.Push(e); if(a.PL_empty()) { cout <<"停车场内无该车,请重新选择输入\n"; break; } a.PopTop(e); } if(e==num) cout <<"车牌号为" <<num <<"的车成功从停车场取出\n"; while(!c.PL_empty()) { c.PopTop(e); a.Push(e); } if(!b.QueueEmpty()&&!a.PL_full()) { b.DeQueue(e); a.Push(e); cout <<"车牌号为" <<e <<"的车成功存入停车场\n"; } if(b.QueueEmpty()) cout <<"无车排队等候\n"; } } void main() { int n; cout <<"输入停车场的最大容车辆数:\n"; cin>>n; ParkingLot A(n); ParkingLot C(n);//暂时存放退出的车 queue B(1); int choice; l1: cout <<"欢迎光临,存车按1,取车按2,结束程序3:"; cin>>choice; switch(choice) { case 1:cunche(A,B);break; case 2:quche(A,B,C);break; case 3:exit(0); default:cout <<"输入有误\n"; } goto l1; }
网友回复:
嗯,是我记错了,应该是不能delete自己,这回对了吧?
网友回复:我是用栈来模拟的停车场,队列是当车场停满后才用来给其他车排队等候的.
~queue()
{
queue *p=front;
while(p!=rear)
{
queue* t = p;
p = p->rlink;
delete t;
}
delete p; //不明白! 为什么加上这一步会出错误
}
只要把delete p; 去掉就能存能储...没错误
但是加上后当队列中排有车时候就不会益处
关键字:析构,函数,delete,问题,
上一篇:如何从一串字符中取出 IP 地址
下一篇:下面没有链接了











文章评论
共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面