C++之一些事一些情--虚析构函数
2013-12-16 22:34
155 查看
《Effective C++》条款14:确定基类有虚析构函数。为什么要这样做呢?引用百度百科对虚析构函数的解释:
虚析构函数是为了解决这样的一个问题:基类的指针指向派生类对象,并用基类的指针删除派生类对象”。
以下是两个类的声明,其中Base类为基类,而Derived类继承自Base类:
下面为相应的测试代码:
上面测试代码的输出结果如下:
从上面的输出结果可以看到,子类Derived的析构函数并没有被调用。若子类Derived的析构函数里面会做一些释放资源操作的话,那么析构函数里面的代码将会徒劳无功了,举个例子,对于STL里面的智能指针auto_ptr,所谓智能就是因为auto_ptr对象在结束生存期时,会在析构函数里面自动调用delete操作以释放所指向的内存空间,若auto_ptr因为某些公有的操作继承自一个没有声明虚析构函数的父类,那么智能指针将不再智能了,随之而来就是内存泄露问题了。
当然,并不是要把所有类的析构函数都声明为虚函数。因为当编译器发现类中有虚函数的时候,就会给类创建一个虚表,用来存放每个虚函数的地址;同时编译器会另外为每个类对象添加一个虚指针,用于指向对象所属类的虚表,这样就会使得类对象占用了更多的内存空间。因此,当一个类被用来作为基类的时候,才把析构函数声明为虚函数。但众所周知,现在普通PC机可用的内存空间越来越大了,也没有人确定一个类以后不会被继承,为了安全起见,个人还是建议把类的析构函数都声明为虚函数。
若将基类Base的析构函数声明为virtual,则上面的测试代码将会得到以下正确的输出结果:
虚析构函数是为了解决这样的一个问题:基类的指针指向派生类对象,并用基类的指针删除派生类对象”。
以下是两个类的声明,其中Base类为基类,而Derived类继承自Base类:
class Base { public: Base(){ cout<<"Base Constructor"<<endl; } ~Base(){ cout<<"Base Deconstructor"<<endl; } }; class Derived : public Base { public: Derived(){ cout<<"Derived Constructor"<<endl; } ~Derived(){ cout<<"Derived Deconstrutor"<<endl; } };
下面为相应的测试代码:
Base *ptr = new Derived; delete ptr;
上面测试代码的输出结果如下:
Base Constructor Derived Constructor Base Deconstructor
从上面的输出结果可以看到,子类Derived的析构函数并没有被调用。若子类Derived的析构函数里面会做一些释放资源操作的话,那么析构函数里面的代码将会徒劳无功了,举个例子,对于STL里面的智能指针auto_ptr,所谓智能就是因为auto_ptr对象在结束生存期时,会在析构函数里面自动调用delete操作以释放所指向的内存空间,若auto_ptr因为某些公有的操作继承自一个没有声明虚析构函数的父类,那么智能指针将不再智能了,随之而来就是内存泄露问题了。
当然,并不是要把所有类的析构函数都声明为虚函数。因为当编译器发现类中有虚函数的时候,就会给类创建一个虚表,用来存放每个虚函数的地址;同时编译器会另外为每个类对象添加一个虚指针,用于指向对象所属类的虚表,这样就会使得类对象占用了更多的内存空间。因此,当一个类被用来作为基类的时候,才把析构函数声明为虚函数。但众所周知,现在普通PC机可用的内存空间越来越大了,也没有人确定一个类以后不会被继承,为了安全起见,个人还是建议把类的析构函数都声明为虚函数。
若将基类Base的析构函数声明为virtual,则上面的测试代码将会得到以下正确的输出结果:
Base Constructor Derived Constructor Derived Deconstrutor Base Deconstructor
相关文章推荐
- C++的虚析构函数的作用
- C++关于string的一些用法
- 刚才在论坛上看到的一些学习C++的东东,可能对初学有点用
- c++中的一些数学库函数
- C++浅析——继承类内存分布和虚析构函数
- c++ 每周一些题(5)
- C++一些注意点之指针成员管理
- C/C++招聘的一些感受和经验
- C++笔试面试一些题汇总
- C++易混点——深度解析指针悬挂和虚析构函数
- C++里你知道的和不知道的一些东西
- C++重载一些需要注意的地方
- c++ iostream库的一些讨论
- Matlab与C/C++/Java的一些区别
- c++继续学习 virtual Destruct function (虚析构函数)
- 【C/C++】C++中一些容易被人忽略的东西 之一 【寥寥代码,让您分清引用和指针】
- 内存管理---编写安全的代码的一些技巧 C++
- 一些经典排序算法的实现(C/C++实现)
- 关于oj上c++与g++的区别以及一些常见的问题
- C++ 和 C# 语法的一些比较