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;

  • 相关阅读:
    2879. [NOI2012]美食节【费用流】
    luogu P1012 拼数
    luogu cover
    luogu cogs . [NOIP2003] 传染病控制 WA(1/2)
    luogu P1340 兽径管理 WA
    luogu P1342 请柬
    HTML学习笔记二
    HTML学习笔记一
    arr.sort()
    编写函数实现随机产生指定范围的整数的功能
  • 原文地址:https://www.cnblogs.com/zhengzhe/p/6600432.html
Copyright © 2011-2022 走看看