zoukankan      html  css  js  c++  java
  • Effective C++条款7:为多态基类声明virtual析构函数

    要点:

    带多态性质的基类或者class中有virtual函数,就应该将析构函数声明为virtual,例如

    class TimeKeeper
    {
    public:
           TimeKeeper();
           ~TimeKeeper();
    };
    
    
    class AtomicClck : public TimeKeeper //原子钟 
    { };
     
    class WaterClck : public TimeKeeper  //水钟  
    { }; 
    
    class WristClck : public TimeKeeper //腕表 
    { };
    
    int main()
    { 
         TimeKeeper * ptk = getTimeKeeper() ; //工厂方法获取钟的对象 
         
         delete ptk ;  //由于父类中的析构函数声明为非virtual,所以只会执行父类的析构函数
                       //这样就会造成子类中特有成员内存泄露 
    }

    以上代码造成内存泄露 没有释放子类一部分所占的内存,解决方法就是 在父类的析构函数前民加virtual,如下:

    class TimeKeeper
    {
    public:
           TimeKeeper();
           virtual ~TimeKeeper();
    };


    相关要点:class内存

    (一)类内部的成员变量:

    • 普通的变量:是要占用内存的,但是要注意对齐原则(这点和struct类型很相似)。
    • static修饰的静态变量:不占用内容,原因是编译器将其放在全局变量区。
    (二)类内部的成员函数:
    • 普通函数:不占用内存。
    • 虚函数:要占用4个字节,用来指定虚函数的虚拟函数表的入口地址。所以一个类的虚函数所占用的地址是不变的,和虚函数的个数是没有关系的。

     PS:就算class内什么都没有,也必须占用一个字节

  • 相关阅读:
    二叉树
    基础1
    tcp/udp
    异步io模块(自定义)
    select+异步
    异步发送请求的几种方式
    多线程,进程实现并发请求
    位解包运算
    从前端程序员的视角看小程序的稳定性保障
    运行node 报错 throw er; // Unhandled 'error' event
  • 原文地址:https://www.cnblogs.com/biyeymyhjob/p/2667596.html
Copyright © 2011-2022 走看看