C++对析构函数的误解

激光可燃气体传感器DIY指南:从TDLAS原理到STM32实战(附代码) 本文详细介绍了如何DIY激光可燃气体传感器,从TDLAS原理到STM32实战,包括硬件选型、光路搭建、电子系统设计和嵌入式软件开发。通过TDLAS技术实现高灵敏度甲烷检测,适合工业安全和环境监测应用。附有完整代码和实用调试技巧,帮助开发者快速掌握光学气体检测技术。 阅读详情

对象在构造的时候系统会分配内存资源,对一些数据成员进行初始化或者赋值;一个良好的class需要有资源回收的机制,而这一操作便落在了析构函数的头上,析构函数来负责类内的资源的free。来看一段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class  myclass
{
     public :
     myclass()
     {
         cout << "构造函数"  << endl;
     }
     ~myclass()
     {
         cout << "析构函数"  << endl;
     }
};
 
int  main()
{
     myclass mc;
     return  0;
}

执行结果:

图1

 

在main主函数当中,如果直接声明一个对象,在声明的时候,直接就调用了类内的构造函数,在主函数结束之前的那一小刻,也自动调用了这个类的析构函数;在看一段代码:

1
2
3
4
5
int  main()
{
     myclass * mc;
     return  0;
}

 执行结果:

 

在main主函数当中,如果直接声明一个对象指针(只是声明而已),既不自动调用构造函数和析构函数。但是将main函数改为下面:

1
2
3
4
5
6
int  main()
{
     myclass * mc;
     mc = new  myclass();
     return  0;
}

执行结果:

 

这里不仅声明了一个对象指针,而且new了,这说明给这一对象指针分配一个内存空间,当然这就会调用构造函数了;咦,奇怪了,为什么不自动调用析构函数了,说明C++内部缺少这一机制,C++毫不客气的对你说:“你提醒我给一个对象分配空间,那也得麻烦你提醒我将它释放(delete)。于是便有:

1
2
3
4
5
6
7
int  main()
{
     myclass * mc;
     mc = new  myclass();
     delete  mc;
     return  0;
}

执行结果:

图1

所以如果是指针在new之后需要手动释放资源。在较大型的工程当中,资源的释放很重要,因为涉及的数据量比较多,稍有不慎,就会造成资源的浪费和泄露之类的问题,从现在起你就应该养成把握资源的好习惯。


条款20:宁以pass-by-reference-to-const替换pass-by-value。——Scott Meyers

为什么要在这里说在函数当中使用“常引用”,固然它跟析构函数有很大的牵连。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class  myclass
{
     public :
     myclass()
     {
         cout << "构造函数"  << endl;
     }
     ~myclass()
     {
         cout << "析构函数"  << endl;
     }
};
 
void  function(myclass mc)
{
}
 
int  main()
{
     myclass mc;
     function(mc);
     return  0;
}

执行结果:

 

结果很明朗,function函数内对myclass类的对象mc作了一次复制(浅复制而已)而造出了另一个对象,也就是函数内的对象副本;调用函数的时候,如果选择是传值调用,那么会有参数副本被复制到函数的栈区。

因为这里调用的myclass类默认的copy构造函数,而不是调用上面myclass类的构造函数,但我们都明白,无论是哪种,都了构造,都是需要花费时间的,先不管时间有多短;遇上析构函数那是必然的。再者,如果myclass类有n个父类,而它的父类又有几个参数需要构造析构,最后还需要层层析构(virtual析构函数《C++虚函数和纯虚函数(1)》)......那这个花费的时间可就不能四舍五入啦。

解决方法就是宁以pass-by-reference-to-const替换pass-by-value。我们这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class  myclass
{
     public :
     myclass()
     {
         cout << "构造函数"  << endl;
     }
     ~myclass()
     {
         cout << "析构函数"  << endl;
     }
};
 
void  function( const  myclass &mc)
{
}
 
int  main()
{
     myclass mc;
     function(mc);
     return  0;
}

结果让我们大吃一惊:

这就是我们想要,而如果你怕function函数内会对mc做一些非法的事情,const可以把他拒之门外。太帅了,实在是太帅了。


转载:http://www.cnblogs.com/daoluanxiaozi/archive/2011/12/09/2281796.html



OpenClaw小白使用全攻略 OpenClaw全能技能解锁指南:从基础到进阶 摘要: 本文提供OpenClaw AI智能体的完整使用教程,帮助用户从安装后"不知道如何用"到熟练掌握核心功能。教程包含:1)控制台5大区域详解和3个必做初始化设置;2)文件管理、浏览器自动化、文档生成等5大基础功能实操,每个功能配有详细操作步骤、指令模板和效果演示;3)10+高频场景解决方案,如整理文件、搜集资料、写总结等;4)进阶技巧和常见问题解答。通过清晰的图文指引,即使电脑小白也能快速上手,实现办公自动化、提升工作效率。 阅读详情

相关推荐

实战指南:从零开始用YOLOv8训练VisDrone无人机检测模型

本文提供了一份详细的实战指南,手把手教你从零开始使用YOLOv8训练一个无人机检测模型。内容涵盖VisDrone数据集下载与格式转换、YAML配置文件编写、模型训练与评估,以及最终的推理部署,旨在帮助开发者快速掌握无人机视角下的目标检测技术。

salt的博客 682

C++之构造函数和析构函数

C++之构造函数和析构函数 构造函数和类名相同,而且不需要任何类型声明。构造函数的作用一般是初始化类中的成员变量的值。 来看一下列表式的构造函数的写法 #include <iostream> #include <cstring> using namespace std; class Structure { public: void set(int width, int height, int length); int get(); //构造函数声明

YANJINING 316

使用mixamo导入人物动作到unity

导入的材质是withoutSkin时选择Create From Other Model + 选择带withSkin里的。方案二:Textures选择Extract Textures,将文件存放到喜欢的位置(不行继续方案三)2.动画没有动:开个Animation窗口,选择人物的Prefab(Hierachy),查看窗口左侧。方案三:选中素材自带或者导出的Material,接着方案一选择 选中的materials进行转化。选 withSkin,剩下的动作选without Skin)(角色发生位移时出现选项)

big_good_boy的博客 1635

c++析构函数

析构函数是用于在对象销毁时执行清理操作的特殊成员函数。局部对象的生存期不会超过其声明所在的代码块作用域,当程序运行到相关作用域的结尾时,析构函数将自动调用以执行清理操作。在 C++ 中,析构函数是用于在对象销毁时执行清理操作的特殊成员函数。与构造函数不同,析构函数的名称是带有 ~(波浪号)符号的类名,并且没有参数和返回类型。需要注意的是,局部对象的生存期不会超过其声明所在的代码块作用域。当对象被销毁时,析构函数将自动调用以执行清理操作。} // 当离开当前块作用域时,pt2对象将被销毁并调用析构函数。

m0_73378369的博客 239

Godot4 TileMap分层绘制全攻略:解决角色、树木遮挡混乱,打造正确视觉层级

本文详细介绍了Godot4 TileMap分层绘制技术,通过图层管理和Y-Sort功能解决2D游戏中角色与物体的遮挡问题。从基础图层设置到高级优化策略,帮助开发者打造符合自然视觉规律的场景层次,提升游戏沉浸感。特别针对TileMap和TileSet的使用提供了实用技巧和代码示例。

weixin_28717411的博客 510

基于MATLAB的BOC调制信号捕获算法仿真

然而,在实际的使用过程中,由于室内信号衰减以及遮挡等因素的影响,接收机在GPS信号弱化时会很容易丢失导航信息。与其他的调制方式相比,BOC具有较好的抗多径性能和更高的频带效率。通过本文的介绍,我们可以更加深入地了解BOC调制信号的捕获算法,并且掌握了如何使用MATLAB软件对其进行仿真实现。通过实验数据的分析,我们可以看出该算法对于BOC调制信号的捕获具有较高的准确率和稳定性,因此具有一定的工程应用价值。在BOC调制完成后,我们需要进行信号的捕获,这一步涵盖了信号检测、码偏差估计、载波频率估计等过程。

2301_79326559的博客 567

C++中虚析构函数的作用

    我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数。可是,为什么要这样做呢?下面用一个小例子来说明:        有下面的两个类:class ClxBase{public:    ClxBase() {};    virtual ~ClxBase() {};    virtual void DoSomething() { cout  "Do something 

寒星轩 19万+

RK3568平台(camera篇) mipi csi接口

MIPI联盟,即移动产业处理器接口(Mobile Industry Processor Interface 简称MIPI)联盟。MIPI(移动产业处理器接口)是MIPI联盟发起的为移动应用处理器制定的开放标准和一个规范。MIPI是差分串口传输,速度快,抗干扰。主流手机模组现在都是用MIPI传输,传输时使用4对差分信号传输图像数据和一对差分时钟信号;MIPI摄像头有三个电源:VDDIO(IO电源),AVDD(模拟电源),DVDD(内核数字电源),不同sensor模组的摄像头供电不同。

weixin_49303682的博客 5345

构造和析构函数

构造和析构函数 1.1 构造函数:主要作用在于创建对象及对象的成员属性赋值 析构函数:主要作用在于对象销毁前系统自动调用 1.2 构造函数没有返回值也不用写void 构造函数可以有参数,可以发生重载 函数名与类名相同 #include<iostream> using namespace std; class p { public: p() { cout << "p函数的构造函数的调用" << endl; } }; 析构函数不可以有参数,不可以重载 没有返回值

sgzyby的博客 396

HSM 网络安全 信息安全

HSM HSM信息安全功能 汽车电子网络安全中HSM 的应用场景 选择适合汽车电子网络安全的 HSM 符合汽车安全标准和法规要求的HSM HSM 在汽车电子网络安全中的可靠性和安全性 评估汽车电子网络的安全性 汽车 HSM(Hardware Security Module)模块开发 汽车 HSM(Hardware Security Module)模块测试

天赐好车的博客 1236

YOLO26改进策略【卷积层】| HWD,引入`Haar小波变换`到下采样模块中,减少信息丢失

本文记录的是。传统的卷积神经网络中常用的最大池化平均池化和步长为2的卷积等操作进行下采样可能会导致信息丢失,为了解决信息丢失问题,HWD作者受无损信息变换方法的启发,引入Haar小波变换到下采样模块中,

Limiiiing的博客 346

澄清对于c++析构函数的误解

以前一直以为析构函数也存在继承。但是今天看了stackoverflow和微软官网的描述后,发现自己错了: 随之而来的一个问题是,既然析构函数不能继承,为什么多态里面总是强调基类的析构函数应该是virtual的? cppreferencevirtual 函数说明符 - cppreference.comhttps://zh.cppreference.com/w/cpp/language/virtual上有一段解释回答了这个问题: 虽然析构函数不存在虚继承,但是派生类还是覆盖了基类的虚析构函数。..

liji_digital的博客 287

出现 Error:Unable to access jarfile xxxx\target\nacos-server.jar 解决方法

Nacos中的 2.x执行步骤如上,如果需要安装下载1.x版本,执行该步骤之后 自动更新下载的是2.x版本 对此如果需要下载安装1.x的版本,可通过如下连接(windows版本)

码农研究僧的博客 5697

C++对析构函数的误解(转)

C++析构前言 析构函数在什么时候会自动被调用,在什么时候需要手动来调用,真不好意思说偶学过C++…今日特此拨乱反正。 C++析构误解正文 对象在构造的时候系统会分配内存资源,对一些数据成员进行初始化或者赋值;一个良好的class需要有资源回收的机制,而这一操作便落在了析构函数的头上,析构函数来负责类内的资源的free。来看一段代码: class myclass...

baidui8622的博客 126

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

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

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C++中虚析构函数的作用之误解

今天在看c++虚函数时,对虚析构函数的作用有了一些疑问,上网查看时,发现很多人博客上写的有误。具体表现为: 如果你这样:  a *pa = new b; // upcast  然后这样:  delete pa;  这句delete, 如果你基类的析构函数不是虚的的话, 就会造成内存泄露, 具体表现为派生类的内存被释放了而基类没有.  后来经过本人测试发现,如果你基类的析构函数不是虚

maowei_123的专栏 478

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

再悟-析构函数

C++对析构函数的误解 2011-12-09 11:56 by 捣乱小子, 3146 阅读, ... 评论, 收藏, 编辑 C++析构前言 析构函数在什么时候会自动被调用,在什么时候需要手动来调用,真不好意思说偶学过C++…今日特此拨乱反正。   C++析构误解正文 对象在构造的时候系统会分配内存资源,对一些数据成员进行初始化或者赋值;一个良好的class需要有资源回收

evil0eye的专栏 489

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C++:构造函数和析构函数能否为虚函数

原文:http://blog.youkuaiyun.com/xhz1234/article/details/6510568 C++:构造函数和析构函数能否为虚函数? 简单回答是:构造函数不能为虚函数,而析构函数可以且常常是虚函数。 (1) 构造函数不能为虚函数 让我们来看看大牛C++之父 Bjarne Stroustrup 在《The C++ Programming Language》里是怎么说的: ...

weixin_34218890的博客 100

析构函数的名字是否包括字符‘~’?

析构函数的名字是否包括字符‘~’? 我的书稿还对流行的教科书存在的一些问题进行了探讨,笔者相信,连教科书都会出现的问题一定具有探讨的必要。 在书稿中隐去了发生问题的教科书的名字,但是在博客文章中我将指出这些书的名字。 孟威、刘慧宁、机工版、ISBN:7-111-08318-0;83页“析构函数的函数名应为类名前加‘~’” 有教科书云:“析构函数的函数名应为类名前加‘~’”,

chenshuzhenteacher的专栏 1854

构造函数与析构函数能否为虚函数?

C++C++C++:构造函数和析构函数能否为虚函数? 简单回答是:构造函数不能为虚函数,而析构函数可以且常常是虚函数。 1.构造函数不能为虚函数 让我们来看看大牛C++C++C++之父 BjarneBjarneBjarne StroustrupStroustrupStroustrup 在《TheTheThe C++C++C++ ProgrammingProgrammingProgramming L...

小二笙的博客 799

C++ 构造函数 析构函数 虚函数

C++:构造函数和析构函数能否为虚函数? 简单回答是:构造函数不能为虚函数,而析构函数可以且常常是虚函数。 (1) 构造函数不能为虚函数 让我们来看看大牛C++之父 Bjarne Stroustrup 在《The C++ Programming Language》里是怎么说的: To construct an object, a constructor needs the exa...

weixin_30881367的博客 76

构造函数的误解

一直以来我以为构造函数的功能是创建对象并且为其成员初始化。现在发现并不是这样,首先我们可以这样理解,c++语言的设计者们为了使得面向对象程序设计中的资源易于管理,发明了构造函数和析构函数,先不考虑这两个函数的到底做了什么,至少有一点是可以确定的,即这两个函数具有这样的特性:构造函数(叫什么名字不重要,你也可以称它为 AAA 函数,αα\alpha 函数等任何你喜欢的名字)在声明一个对象的时候,会被...

New life 446
上一篇: objdump 反汇编
下一篇: JNI搭建:native方法注册或NDK中的方法对应
panfengsoftware
博客等级 码龄20年 38粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值