C++之虚析构函数
来源:互联网 发布:网络言论自由的优点 编辑:程序博客网 时间:2024/06/08 04:39
先给个例子:
class Animal{public: Animal(); ~Animal(); virtual void voice() = 0;};Animal::Animal(){ cout << "Animal()" << endl;}Animal::~Animal(){ cout << "~Animal()" << endl;}class Dog:public Animal{public: Dog(); ~Dog(); virtual void voice();};Dog::Dog(){ cout << "Dog()" << endl;}Dog::~Dog(){ cout << "~Dog()" << endl;}void Dog::voice(){ cout << "I am a dog: wang wang wang wang" << endl;}class Cat:public Animal{public: Cat(); ~Cat(); virtual void voice();};Cat::Cat(){ cout << "Cat()" << endl;}Cat::~Cat(){ cout << "~Cat()" << endl;}void Cat::voice(){ cout << "I am a cat: miao miao miao" << endl;}int main(){ Animal *ani = new Dog; ani->voice(); delete ani; ani = new Cat; ani->voice(); delete ani; system("pause"); return 0;}
输出结果为:
这里是在堆上创建的对象,delete了ani,发现结果中只有Dog和Cat的构造,却没有Dog和Cat的析构,而只析构了Animal,这就会发生内存泄漏。
解决的办法就是对基类Animal的析构函数变成虚函数,就会先调用子类的析构函数,然后再调用基类的析构函数,这样就形成了完全析构,避免了内存泄漏的问题,这里只需要在Animal的析构函数前面加个virtual即可:
class Animal{public: Animal(); virtual ~Animal(); //虚析构函数 virtual void voice() = 0;};
输出结果:
0 0
- C++---------之--------【虚析构函数】
- c++------------之---【虚析构函数应用】
- c函数之【时间函数】
- c函数之【数据结构函数】
- c函数之【随机数函数】
- c函数之【信号函数】
- c函数之【记录函数】
- c函数之【环境变量函数】
- c函数之【动态函数】
- c函数之【其他函数】
- C语言之函数
- C函数之strfry
- C函数之memstr
- c函数之offsetof
- C语言之函数
- C/C++之函数
- C语言之函数
- C-[之函数指针]
- 『Python学习』scipy库学习
- 我的第一篇博客
- 在线编译C++程序、java api、python
- eclipse中使用junit4单元测试入门
- C语言中将二维数组作为参数传递给函数的方法
- C++之虚析构函数
- Xcode build版本号自动跟随时间变化脚本
- webview javascript 注入方法
- java基础整理-IO流
- 剑指offer第一题
- dp再回顾之思路分析,及小知识点总结
- Working with SSH key passphrases
- Sparse Autoencoder 稀疏自动编码
- 手把手教你我是如何用H5制作工具在微信上宣传我的店铺