虚析构函数

C++中的虚析构函数 Cpp中的虚析构函数 1.虚析构函数的作用:为了避免内存泄漏,而且是当子类中会有指针成员变量时才会使用到。即虚析构函数使得在删除指向子类对象的基类指针时,可以调用子类的析构函数来实现释放子类中堆内存的目的,从而防止内存泄漏。 2.C++中开发中,基类中的析构函数一般都是虚函数,如下面的例子: #include <iostream> using namespace std; // 基类 class Base{ public: ... 阅读详情

虚析构函数就是为了当删除一个派生类对象的时候,派生类的析构函数被调用。。。

vs2013编译的一个程序:

头文件:default.h

#include <iostream>
#include <cstring>
using namespace std;

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

class CDerived : public CBase
{
public:
	CDerived(char *str);
	~CDerived();
private:
	char *name;
};


函数实现:

function.cpp

#include "default.h"

CBase::CBase()
{
	cout << "构造函数CBase被调用!!" << endl;
}

CBase::~CBase()
{
	cout << "析构函数CBase被调用!!" << endl;
}

CDerived::CDerived(char *str)
{
	name = new char[strlen(str) + 1];
	strcpy_s(name,strlen(str)+1 ,str);  //这里的strcpy_s一定要是三个参数
	cout << "构造函数CDerived被调用!!" << endl;
}

CDerived::~CDerived()
{
	cout << "析构函数CDerived被调用!!" << endl;
	if (name)
	{
		delete []name;
		name = NULL;
	}
		
}

主函数:

main.cpp

#include "default.h"

int main(int argc, char* argv [])
{
	CDerived derived("ding");
	CBase *p1 = &derived;
	cout << "----------强制析构----------------" << endl;
	p1->~CBase();
	cout << "----------new CDerived------------" << endl;
	CBase *p2 = new CDerived("zheng");
	delete p2;
	cout << "----------delete CDerived---------" << endl;
	return 0;
}

执行代码的结果:

当我们把

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

修改为

class CBase
{
public:
	CBase();
	~CBase();
};

把virtual去掉之后编译的结果:

明显可以看出不用虚析构函数之后,当我们删除派生类CDerived的对象p2的时候,它的析构函数没有被调用!

这里就会造成内存泄露。

而且也不是所有的类都要虚析构函数,一般只用于基类。


【Creo】关于Creo一换网络就报错许可证丢失问题解决方案 依照我的个人理解,Creo只要一更换网络,则其许可证里面的网卡参数和现在的网络就对不上了,所以就会出现报错,并且有可能是报错代码(-9),提示许可证激活有问题。 阅读详情

相关推荐

TOGAF9.2/10 认证基础知识点概览表

(考点解析:业务场景是一种重要的技术,可以在企业架构的各个阶段使用,主要是架构愿景和业务架构,但如果需要,也可以在其他架构域中使用,以直接从业务的高级需求中派生架构的特征。“哪里”可以看作是对相关企业的界定、“为什么”可以被视为组织环境中的关键驱动因素和要素、“谁”是指确定发起人利益相关者和受业务指令影响的其他主要利益相关者,以创建企业架构,并确定他们来自企业的需求和优先级、他们与企业的关系以及彼此之间所需的工作行为。它是业务驱动和业务主导的,它结 合了所有业务线的必要努力,以实现所需的能力。

2302_81497763的博客 2076

C++中虚析构函数的作用及其原理分析

参考http://blog.youkuaiyun.com/xiamentingtao/article/details/55517203 C++中的虚析构函数到底什么时候有用的,什么作用呢。 一.虚析构函数的作用 总的来说虚析构函数是为了避免内存泄露,而且是当子类中会有指针成员变量时才会使用得到的。也就说虚析构函数使得在删除指向子类对象的基类指针时可以调用子类的析构函数达到释放子类中堆内存的目的,而防止内

哒哒的博客 6万+

Android 集成 Google 与 Facebook 第三方登录实战详解(2024版)

本文详细介绍了2024年Android应用集成Google与Facebook第三方登录的完整实战指南。通过分步教程和代码示例,帮助开发者快速实现一键登录功能,提升用户体验和注册转化率,同时涵盖隐私合规和常见错误处理的最佳实践。

blue的专栏 822

【C++】多态 ⑤ ( 虚析构函数 | 虚析构函数语法 | 虚析构函数意义 | 父类指针指向子类对象情况下父类和子类使用 virtual 虚析构函数 | 代码示例 )

一、虚析构函数 1、构造函数不能是虚函数 2、析构函数可以是虚函数 3、虚析构函数语法 4、虚析构函数意义 二、代码示例 - 虚析构函数 1、代码示例 - 没有使用虚析构函数导致子类析构函数无法调用 2、代码示例 - 使用虚析构函数正确示例

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 3998

RedPitaya火龙果板基础操作

火龙果板基础操作一级目录二级目录三级目录 一级目录 二级目录 三级目录

qq_41523340的博客 9720

【学习记录】IIC驱动ICM42670+卡尔曼滤波+四元数姿态角解算

ICM42670陀螺仪可以使用iic驱动,单片机平台使用GD32f305VE。

liarsup的博客 8262

简述虚析构函数与纯虚析构函数

基础知识: C++中,一个类在建成时,需要有构造函数初始化。即当一个类的对象在生成时,会先调用构造函数初始化,再执行接下来的其他函数。而在一个类的对象指针被释放的时候,会调用析构函数。即使析构函数不被声明,也会隐式调用析构函数。 那么,当一个派生类继承了一个基类,这时候调用析构函数,会发生什么呢? #include <iostream> using namespace std;...

wufeifan_learner的博客 2031

利用树莓派制作智能音箱

利用树莓派制作智能音箱

qq_61803022的博客 1777

C++虚析构函数和纯虚析构函数

1、为什么要使用虚析构函数 我们知道析构函数是在对象生命周期结束时自动被调用,用来做一些清理工作(如释放句柄,释放堆内存等),防止出现内存泄漏。 那怎么还有虚析构函数呢? 使用虚析构函数的类一般是要作为基类,被其他类继承。通过把基类的析构函数声明为虚函数,就可以通过父类指针来释放子类对象,从而完成子类的一些清理工作,防止出现内存泄漏。 案例1:基类析构函数为非虚函数 //test.h class Parent { public: Parent(); ~Parent

技术成就梦想,梦想成就未来。If you try hard enough, it can be. 2634

【YOLO26科研级突破】集成BiFPN双向特征金字塔,让多尺度特征融合效率与精度双跃升

打开确保模型解析器能识别BiFPN模块。通过将BiFPN双向特征金字塔集成到YOLO26中,我们实现了一个“全尺度双向特征流动+加权融合+精准检测”的目标检测模型。这个改进不仅在工程上能大幅提升多尺度、复杂场景下的检测精度,更在科研上提供了“双向特征融合”的创新思路——这种思路可以延伸到其他检测网络(如Faster R-CNN、SSD)的Neck模块改进中,帮你在论文中打造独特的研究点。

LXY_LOVE36的博客 200

Mac 下 OpenClaw 安装全记录:从零到一的保姆级图文教程

本文主要介绍了Mac 下 OpenClaw 安装全记录:从零到一的保姆级图文教程,希望能对学习使用OpenClaw 的同学们有所帮助。 文章目录 1. 背景 2. 安装教程 2.1 安装OpenClaw 2.2 配置模型 2.3 对话 3. 后续使用步骤 4. 关闭程序

weixin_43178406的博客 11万+

什么时候要用虚析构函数

虚析构函数 在 Effective C++ 中找到了答案。书中说到在 C++ 中,当派生类(derived class)对象由一个基类(base class)指针删除时,若基类有一个非虚函数(non-virtual)的析构函数时,其结果是未定义的——实际执行时通常发生的是对象的派生类部分没有被销毁。例如下面的示例: #include <iostream> using namesp...

weixin_41066529的博客 2601

【BUG已解决】RuntimeError: CUDA error: no kernel image is available for execution on the device 解决方案

方案适用场景推荐指数精确匹配官方版本绝大多数场景(大众消费卡+主流数据中心卡)⭐⭐⭐⭐⭐安装历史旧版本Pascal/Maxwell等老显卡⭐⭐⭐⭐安装Nightly版本刚发布的最新架构显卡⭐⭐⭐⭐源码编译官方各版本均不支持的特殊硬件⭐⭐Docker官方镜像追求省心、避免版本排查⭐⭐⭐⭐⭐的核心是PyTorch 预编译包不包含你显卡对应的计算能力架构先确认显卡真实计算能力),而不是盲目重装驱动对比 PyTorch 支持的架构列表),定位是否真的不匹配精确匹配官方版本。

博客 1万+

虚析构函数的作用

虚析构函数的作用 析构函数的作用 类的析构函数是为了释放内存资源,析构函数不被调用的话就会造成内存泄漏。 虚析构函数 定义为虚析构函数是为了当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用。 但并不是要把所有类的析构函数都写成虚函数。只有当一个类被用来作为基类的时候,才把析构函数写成虚函数。 示例代码: class Base { public: Base(string data) : m_data(data){ } ~Base(){ cout << "Base

oykotxuyang的博客 1807

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

析构函数、虚析构函数、纯虚析构函数

我们知道对象在结束其生命周期之前,都会调用析构函数以完成必要的清理工作;派生类调用的析构函数顺序是“先子类,后基类”; 这篇文章用于总结当析构函数是普通析构函数、虚析构函数、纯虚析构函数时,我们使用delete运算符删除一个指针对象时,析构函数会有什么情况发生; 普通析构函数 CBase是基类,CDerive是其子类,类源码代码如下: class CBase { public: CBase(){} //基类析构函数 ~CBase(){ cout << "CBase Des

sinat_36002055的博客 1561

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C++基础---虚析构函数与纯虚析构函数

1. 虚析构函数与纯虚析构函数 1.1 虚析构函数与纯虚析构函数的定义 虚析构函数:为了解决基类的指针指向派生类对象,并用基类的指针删除派生类对象; 虚析构函数:当且仅当类里包含至少一个虚函数的时候才去声明虚析构函数,无故的声明虚析构函数和永远不去声明一样是错误的; class <类名> { virtual ~<类名>(); … }; 即:virtual ~A(); 纯虚析构函数:抽象类是准备被用做基类的,基类

Catherine的笔记 1795

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

6.4虚析构函数和纯虚析构函数

虚析构函数和纯虚析构函数

qq_52563729的博客 1152

【C++虚析构函数深度解析】:为何纯虚析构函数如此关键?

掌握虚析构函数的纯虚实现,有效防止内存泄漏。详解其在抽象基类中的应用,确保派生类正确析构。涵盖语法规范、典型使用场景与多态安全优势,是C++资源管理的关键实践,值得收藏。

CompiShoal的博客 702

什么时候需要虚析构函数

什么时候需要虚析构函数     选择自 jackieyoung 的 Blog 关键字  什么时候需要虚析构函数出处   答案:当你的类准备给别人继承时要提供虚析构函数考虑下面例子:class A{public: A(){cout  ~A(){cout };class B

titicacahang的专栏 1095

虚析构函数详解

众所周知,virtual函数(虚函数),是实现动态调度(运行时多态) 概念:当基类指针指向子类对象时候,虚函数能实现运行时多态(多态指:同一个接口的不同实现方式) 虚析构函数:当基类指针指向指针对象的时候,需要把基类的析构函数设置成虚析构,防止内存泄露 1、当基类析构函数不设置为虚析构 class BaseClass { public: BaseClass() {} ~BaseCl...

qq_15821883的博客 1万+

C++ 虚析构函数的作用

虚析构函数 多态继承中,使用基类base声明指针变量d,指针实际指向子类derived时,如果基类的析构函数不是虚函数,则在delete该指针时,只会调用基类的析构函数而不会调用子类的析构函数,因此会造成子类析构函数中的内存释放指令不会运行,造成内存泄漏。 #include&amp;amp;lt;iostream&amp;amp;gt; using namespace std; class base { public: bas...

weixin_42333471的博客 3510
上一篇: 静态成员函数调用非静态成员变量
下一篇: Qt纯代码显示中文乱码的问题
ckangle
博客等级 码龄14年 48粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值