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;

  • 相关阅读:
    VIJOS-P1446 最短路上的统计
    洛谷 CF997A Convert to Ones
    USACO Your Ride Is Here
    NOIP 2006 明明的随机数
    NOIP 2008 传球游戏
    数据结构—链表详解
    洛谷 P1160 队列安排
    洛谷 P1167 刷题
    JDOJ 2982: 最大连续子段和问题
    洛谷 P1123 取数游戏
  • 原文地址:https://www.cnblogs.com/zhengzhe/p/6600432.html
Copyright © 2011-2022 走看看