学习了好长时间了,编了程序也很多了,有时却觉得自己变得糊涂了。
对于栈中的局部变量,比如在函数中定义的,会随着函数的结束而释放。而堆中的变量,不会随着函数的结束而释放,它是用new分配,直到用delete释放。程序示例:
#include<iostream.h>
class A
{
public:
int a;
A *next;
};
class B
{
A *head;
A *tail;
public:
B()
{
head=new A;
head->a=1;
head->next=NULL;
tail=head;
}
void insert1()
{//用new分配的空间,是程序员自己管理的空间,只有当程序员自己释放后,才会释放
A *p=new A;
p->a=2;
p->next=NULL;
head->next=p;
tail=p;
}
/*void intsert2()
{//随着函数的结束自动变量被释放,那么tail将指向一个被释放的空间,也就意味着tail->next将不是NULL
A aa;
aa.a=3;
aa.next=NULL;
tail->next=&aa;
tail=&aa;
}*/
void print()
{
A *p=head;
while(p)
{
cout<<p->a<<endl;
p=p->next;
}
}
~B()
{
tail=head;
while(head)
{
head=head->next;
delete tail;
tail=head;
}
}
};
void main()
{
B b;
b.print();
b.insert1();
b.print();
//b.intsert2();
//b.print();
}
如果红字部分也加入的话,由于空间释放的原因,tail所指向的空间将不是NULL,所以程序执行的结果,将会是一个死循环。
对于上面的问题,注意喽!