zoukankan      html  css  js  c++  java
  • 虚析构函数的要求

     1 void main()
     2 {
     3     TPerson* p;
     4     TStudent* sp;
     5     //创建一个TPerson类对象并将其他地址储存在p指针中
     6     p = new TPerson(/*省略此处*/);
     7     //释放p所指对象
     8     delete p;
     9     sp = new TStudent(/*省略此处*/);
    10     
    11     p = sp;
    12     delete p;
    13 }

    p=sp;

    让p指向了sp中的TPerson部分;

    当delete p时,只释放了TPerson的部分,但没有释放TStudent的动态分配的部分,并且TStudent类已经无法使用,所以导致严重的内存泄露。

    所以我们将在TPerson类的析构函数中加上virtual关键字。

    1 class TPerson
    2 {
    3 public:
    4     //其他细节省略
    5     virtual ~TPerson();
    6     
    7 };

    改动后,通过p调用delete时,编译器将调用TStudent类的析构函数(因为动态绑定)。TStudent类的析构函数将自动调用TPerson类的析构

    函数,这些都由编译器来完成,无需程序员操心。

    只有用基类指针动态使用对象的情况下,已经删除指向派生类对象的基类指针时,才会导致内存泄露;

    一些注意事项:

    当使用基类时,要看该基类的析构函数是否声明为virtual;

  • 相关阅读:
    R()函数的使用 tp2
    __call()的使用
    tp3.1.3 引入静态页面
    tp3.1.3创建应用
    .env文件的使用 thinkphp51
    concat()和push()的区别
    小程序模板template使用
    56. 从1到n整数中1出现的次数
    55. 连续子数组的最大和
    54. 数据流中的中位数
  • 原文地址:https://www.cnblogs.com/zhengzhe/p/6600432.html
Copyright © 2011-2022 走看看