说明:
- 系统只会自动释放栈内空间,而堆内空间需要用户自己维护。C++中,除了new来的空间存放在堆内,其他均存放在栈中。当单纯的创建对象的时候,对象存放在栈中,此时在程序块的}后面,系统会自动调用析构函数,释放掉栈空间。但是,如果创建了指向new来的一块空间的指针的时候,如果在没有显示释放掉new到的堆空间时,系统是不会自动调用析构函数去释放栈空间中的指针的。
- 先调用父类的构造函数,后调用子类的构造函数。先调用子类的析构函数,后调用父类的析构函数。
- 如果指针声明的为父类的指针,并且父类的析构函数不是virtual,那么只会调用父类的析构函数,不会调用子类的析构函数。
例1:
#include <stdio.h>
class A{
public:
A(){
printf("A is created\n");
}
~A(){
printf("A is deleted\n");
}
};
class B:public A{
public:
B(){
printf("B is created\n");
}
~B(){
printf("B is deleted\n");
}
void print(){
printf("B print\n");
}
};
int main(){
B b;
b.print();
return 0;
}
输出为:
A is created
B is created
B print
B is deleted
A is deleted
例2:
#include <stdio.h>
class A{
public:
A(){
printf("A is created\n");
}
~A(){
printf("A is deleted\n");
}
};
class B:public A{
public:
B(){
printf("B is created\n");
}
~B(){
printf("B is deleted\n");
}
void print(){
printf("B print\n");
}
};
int main(){
B *b=new B;
b->print();
return 0;
}
输出为:
A is created
B is created
B print
不会自动调用析构函数,而且会发生内存泄露。
例3:
#include <stdio.h>
class A{
public:
A(){
printf("A is created\n");
}
~A(){
printf("A is deleted\n");
}
};
class B:public A{
public:
B(){
printf("B is created\n");
}
~B(){
printf("B is deleted\n");
}
void print(){
printf("B print\n");
}
};
int main(){
A *a=new B;
delete a;
return 0;
}
输出为:
A is created
B is created
A is deleted
没有调用子类B的析构函数。
例4:
#include <stdio.h>
class A{
public:
A(){
printf("A is created\n");
}
virtual ~A(){
printf("A is deleted\n");
}
};
class B:public A{
public:
B(){
printf("B is created\n");
}
~B(){
printf("B is deleted\n");
}
void print(){
printf("B print\n");
}
};
int main(){
A *a=new B;
delete a;
return 0;
}
输出为:
A is created
B is created
B is deleted
A is deleted
调用了子类的析构函数。