析构函数里delete的问题

时间:2008-05-09 19:06:51   来源:论坛整理  作者:  编辑:chinaitzhe
#include <iostream>
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自已的类型,不然会崩的。
网友回复:
引用 6 楼 Turntogo 的回复:
析构函数里不要delete自已的类型,不然会崩的。


谁说不能?
怕是你做递归时,堆栈出错吧。
网友回复:
引用 2 楼 HelloDan 的回复:
~queue()
{
queue *p;
while(front!=rear)
{
p=front->rlink;
delete front;
front=p;
}
delete front; //不明白! 为什么加上这一部会出错误

你是想实现像智能指针那样的功能吗?你在哪里加的不行?

试下这个,也许你能找到答案
~queue()
{
queue *p;
queue **tmp;
while(front!=rear)
{
p=front->rlink;
*tmp = &front;
delete front;
tmp = NULL;
front=p;
}
if (front !!= NULL)
delete front; //也许就不会出错了。
网友回复:
引用 8 楼 sandAhrow 的回复:
引用 2 楼 HelloDan 的回复:
~queue()
{
queue *p;
while(front!=rear)
{
p=front->rlink;
delete front;
front=p;
}
delete front; //不明白! 为什么加上这一部会出错误

你是想实现像智能指针那样的功能吗?你在哪里加的不行?

试下这个,也许你能找到答案
~queue()
{
queue *p;
queue **tmp;
while(front!=rear)
{
p=front->rlink;
*tmp = &front;
delete front;
tmp = NULL;
front=p;
}
if (f…


~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; 

    

    

} 

    


网友回复:
引用 7 楼 sandAhrow 的回复:
引用 6 楼 Turntogo 的回复:
析构函数里不要delete自已的类型,不然会崩的。


谁说不能?
怕是你做递归时,堆栈出错吧。


嗯,是我记错了,应该是不能delete自己,这回对了吧?
网友回复:我是用栈来模拟的停车场,队列是当车场停满后才用来给其他车排队等候的.
~queue()
{
queue *p=front;
while(p!=rear)
{
queue* t = p;
p = p->rlink;
delete t;
}
delete p; //不明白! 为什么加上这一步会出错误
}
只要把delete p; 去掉就能存能储...没错误
但是加上后当队列中排有车时候就不会益处
关键字:析构,函数,delete,问题,

文章评论

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