虚析构函数相关知识

news/2024/11/16 14:59:11/

问题一:哪些函数不能实现为虚函数

注:虚函数的条件:

虚函数能产生地址,存在vftable中

对象必须存在(vfptr->vftable->虚函数地址)

  • 构造函数
    • virtual+构造函数,错误
    • 构造函数中调用虚函数,不会发生动态绑定(只发生静态绑定)
  • static静态成员方法也不能加virtual

为什么需要虚析构

首先看如下例子:

#include <iostream>
#include <typeinfo>
using namespace std;class Base
{
public:Base(int data) :ma(data) {cout << "Base()" << endl;}~Base(){cout << "~Base()" << endl;}virtual void show() { cout << "Base::show()" << endl; }//virtual void show(int) { cout << "Base::show(int)" << endl; }protected:int ma;
};class Derive : public Base
{
public:Derive(int data = 20) : Base(data), mb(data) ,ptr(new int(data)){cout << "Derive()" << endl;}~Derive(){delete ptr;cout << "~Derive()" << endl;}void show() { cout << "Derive::show()" << endl; }
private:int mb;int *ptr;
};int main()
{Base* pb = new Derive(10);pb->show(); // 动态绑定delete pb;return 0;
}

输出结果为:
Base()
Derive()
Derive::show()
~Base()

可以发现没有调用派生类的析构函数 ~Derive(),这将会导致内存泄漏.

这是因为析构函数不是虚函数,delete pb时是静态绑定只调用基类的析构,而不回去调用派生类的析构。

解决方法

将基类析构设置为virtual,此时派生类vftable的虚函数就有&Derive::show()&Derive::~Derive().这样delete pb时会发生动态绑定调用派生类析构,然后根据继承机制再调用基类析构。

要点

  • 虚析构函数,析构函数调用时,对象是存在的
  • 基类的析构函数是virtual虚函数,则派生类的析构函数自动成为虚函数,虽然这两个析构不同名
  • 什么时候基类的析构必须实现为虚函数?

答:基类指针(引用)指向堆上new出来的派生类对象时, delete 基类指针,调用析构时必须发生动态绑定,否则导致派生类析构不会被调用,造成内存泄漏


http://www.ppmy.cn/news/60681.html

相关文章

Eplan 部件库导入部件的方法

1. 部件宏文件如何下载 1.1 西门子部件宏文件下载 EPLAN 的部件库是可以更新的&#xff0c;一般元器件厂商会提供其部件文件&#xff0c;以 SIEMENS 为例 进入网站&#xff0c;点击EPLAN 的图标 https://www.automation.siemens.com/bilddb/index.aspx?langen 在订货号中输…

专利权申请转让

​专利权主体变更的区别在于专利申请阶段不同。但需要注意的是&#xff0c;无论专利申请权在哪个阶段转让&#xff0c;转让双方都应当签订书面合同&#xff0c;并向国务院专利行政部门登记&#xff0c;由国务院专利行政部门公告&#xff0c;否则不是真正意义上的专利申请权转让…

iOS热更新-8种实现方式

一、JSPatch 热更新时&#xff0c;从服务器拉去js脚本。理论上可以修改和新建所有的模块&#xff0c;但是不建议这样做。 建议 用来做紧急的小需求和 修复严重的线上bug。 二、lua脚本 比如&#xff1a; wax。热更新时&#xff0c;从服务器拉去lua脚本。游戏开发经常用到。…

优思学院|8D和DMAIC两种方法应如何选择?

在现代的商业环境中&#xff0c;客户投诉是一个非常常见的问题。当客户不满意产品或服务时&#xff0c;他们往往会向企业发出投诉。质量管理部门是一个负责处理这些投诉的重要部门&#xff0c;因为它们需要确保产品和服务的质量满足客户的期望。改善方法是质量管理部门用来解决…

Docker安装doris

1. 软硬件要求 1.1 硬件要求 最低配置&#xff1a;2C 4G 推荐配置&#xff1a;4C 16G 1.2 软件要求 Docker Version&#xff1a;20.10 及以后版本 2. Docker Image 构建 Dockerfile 脚本编写需要注意以下几点&#xff1a; 基础父镜像选用经过 Docker-Hub 认证的 OpenJDK 官…

自动抓取QQ好友列表?Windows UIA教你轻松实现

目录&#xff1a;导读 引言 选择Windows UIA框架进行自动化测试的原因 查找窗口 读取QQ软件的好友列表 结语 引言 每个使用QQ的人都有自己的好友列表&#xff0c;但是如果你想要查看所有好友信息&#xff0c;手动一个个点击会非常浪费时间。那么有没有什么快速获取好友列…

【学习笔记】「JOISC 2022 Day2」复制粘贴 3

看了正解。我觉得很厉害。虽然用减枝水过去了。 区间 d p dp dp。但是这个转移怎么看都不是 O ( 1 ) O(1) O(1)的。 border \text{border} border 那么 trick \text{trick} trick应该都能看出来。能进行剪切操作当且仅当 s [ l , p ] s [ q , r ] s_{[l,p]}s_{[q,r]} s[l,p]​…

three.js学习 06 - 结合GSAP(补间动画)设置各种动画效果(运动效果与双击暂停动画等效果)

1. GSAP简介 GSAP&#x1f44d;&#x1f3fc;是前端业内非常有名的一个动效库&#xff0c;有大量的优秀的网站都在使用它。它不仅能在原生JS的环境下使用&#xff0c;也能配合各种当前流行的框架进行使用。 通过使用它&#xff0c;非常多原本实现起来很有难度的交互动画效果&a…