C++:部分题目

1. 封装、继承、多态

封装:将所需的数据成员,以及对数据的操作方法(成员函数),绑定在一起成为类(类型),定义该类型的对象时,成员被自动隐藏在对象内部。通过封装可以限定对数据的直接访问,限定类的成员函数访问和操作,类的对象、友元类/友元函数访问类的成员。

继承:可以极大的提高代码的复用率,便于提高代码的可读性、可维护性。子类继承父类的属性、方法,减少重复代码,处了父类的构造函数、析构函数外都可以继承,但是由于继承方式和父类的成员属性,访问权限由情况而定,子类可以隐藏父类的同名函数,作为自己的更新函数功能

多态:是在继承与虚函数的继承上实现的,虚函数是父类定义初始化成员时加入关键词virtual ,而子类继承父类的虚函数,并且进行覆盖(区别于无虚函数的重载),他允许函数参数列表内含有父类的指针、引用时,由最终函数调用的需要传入子类对象,实现不同的操作结果。

2. 类里面static是在什么时候初始化,如果一个函数里面有一个static变量,此时static什么时候初始化?

答:

  1. 全局静态变量在编译时初始化(主函数被调用前初始化仅一次)
  2. 局部的static变量仅在函数中有效,第一次进入函数初始化,之后沿用上一次的值
  3. 局部的静态变量的生命周期在主函数结束时才结束,因为他有全局静态数据区

3. 如果出现了内存泄漏的问题,有什么方法可以避免?

内存溢出:OOM(out of Memory);比如申请了一个int,但给它存了long才能存下的数,那就是内存溢出。

内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。最终的结果就是导致OOM

内存泄漏的四种常见情况:

指针重新赋值

char * p = (char *)malloc(10);
char * np = (char *)malloc(10);
p=np;

这时候,指针变量 p 被 np 指针重新赋值,其结果是 p 以前所指向的内存位置变成了孤立的内存。它无法释放,因为没有指向该位置的引用,从而导致 10 字节的内存泄漏

类似的情况,连续重复new的情况也是类似:

int *p = new int; 
 p = new int...;//错误

错误的内存释放 

假设有一个指针变量 p,它指向一个 10 字节的内存位置。该内存位置的第三个字节又指向某个动态分配的 10 字节的内存位置。

如果程序需要执行如下赋值语句时:

free(p);

很显然,如果通过调用 free 来释放指针 p,则 np 指针也会因此而变得无效。np 以前所指向的内存位置也无法释放,因为已经没有指向该位置的指针。换句话说,np 所指向的内存位置变为孤立的,从而导致内存泄漏。

正确处理:因此,每当释放结构化的元素,而该元素又包含指向动态分配的内存位置的指针时,应首先遍历子内存位置(如本示例中的 np),并从那里开始释放,然后再遍历回父节点,如下面的代码所示:

free(p->np);
free(p);

返回值的不正确处理

有时候,某些函数会返回对动态分配的内存的引用,如下面的示例代码所示:

char *f() { return (char *)malloc(10); }
void f1(){ f(); }

函数 f1 中对 f 函数的调用并未处理该内存位置的返回地址,其结果将导致 f 函数所分配的 10 个字节的块丢失,并导致内存泄漏

在内存分配后忘记使用 free 进行释放

如何避免内存泄漏:

  1. 已经以动态申请的地址初始化的指针,在该指针地址未释放前,不要被其他指针赋值
  2. malloc 分配的 于free()对应,New 分配与delete对应
  3. 当指针写值时,确保写入的字节数不会超过分配的字节数
  4. 释放结构化元素时,先遍历释放子内存的堆内存,再释放父节点内存
  5. 正确处理动态分配的内存引用函数的返回值

4. 如果让你设计一个监测内存泄漏的方法,你有什么思路?

设计一个监测内存泄漏的方法,我会考虑以下几个关键步骤和思路:

  1. 工具选择:首先,我需要选择一个合适的内存分析工具。对于C++程序,可以考虑使用如Valgrind、AddressSanitizer(ASan)或Visual Studio的内存分析工具等。这些工具可以帮助我检测内存泄漏和其他内存相关的问题。
  2. 代码插桩:在某些情况下,可能需要在代码中插入特定的监控代码(即插桩),以便更精确地跟踪内存分配和释放。这可以通过使用特定的库或框架来实现,这些库或框架提供了用于内存管理钩子函数。
  3. 内存快照:在程序运行的不同阶段,我可以捕获内存的快照。通过比较这些快照,我可以找出哪些内存块在不再需要时没有被释放。这可以通过比较不同时间点的内存映射或堆状态来实现
  4. 引用计数:对于使用引用计数的内存管理系统,我可以检查引用计数是否在所有引用都被删除后归零。如果引用计数不为零,那么可能存在内存泄漏。
  5. 垃圾回收:如果语言或系统支持垃圾回收,我可以检查垃圾回收器是否能够正确回收不再使用的内存。如果不能,那么可能存在内存泄漏。
  6. 日志和报告:我需要设计一种方式来记录检测到的内存泄漏,并生成详细的报告。报告应包含泄漏的内存大小、位置(如文件名和行号)以及可能的原因。
  7. 自动化测试:将内存泄漏检测集成到自动化测试流程中,以确保每次代码更改后都会进行内存泄漏检查。这有助于及早发现并修复内存泄漏问题。
  8. 教育和培训:最后,但同样重要的是,对开发团队进行内存管理和内存泄漏相关的教育和培训。了解如何避免常见的内存泄漏问题,以及如何使用工具来检测和修复这些问题,对于减少内存泄漏至关重要。

5. 如何监测到内存申请?(挂钩子)

6. new \malloc申请失败的话有什么区别?

malloc返回空,new 返回异常

7. 虚继承与虚函数

虚函数:

  • 虚函数是使用virtual关键字声明的函数,它是动态多态实现的基础。当一个类中的成员函数被声明为虚函数时,任何派生类都可以覆盖(重写)这个函数,并且通过基类指针或引用来调用该函数时,将执行派生类中的版本,而不是基类中的版本。这就是多态性的体现。
  • 虚函数主要用于解决基类指针或引用指向派生类对象时,调用基类的成员函数而实际执行派生类成员函数的问题。这允许我们在不改变基类代码的情况下,通过派生类来扩展或修改基类的行为
  • 虚函数后+ “ =0 ”表示未纯虚函数,无需定义无实际意义,仅仅作为基类描述派生类的接口,而含有纯虚函数的基类为抽象类,抽象类无法定义对象,其唯一的作用为派生派生类,而派生类实现继承的纯虚函数改为虚函数后,抽象类作为接口实现多态性

虚继承:

虚继承则是为了解决多重继承中的数据冗余和二义性问题。在菱形继承体系中,如果没有使用虚继承,子类会多次继承同一个基类,导致基类数据在子类中存在多份拷贝,这不仅浪费空间,还可能导致访问时的歧义。

使用虚继承后,被虚继承的基类称为虚基类,虚基类的子类除了拥有虚基类的成员变量之外,还额外拥有一个指针,称为虚基类表指针。通过这个指针和偏移量,子类可以访问虚基类的成员,避免了数据冗余和二义性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/472360.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

模拟算法总述

模拟 1.模拟算法介绍 模拟算法通过模拟实际情况来解决问题,一般容易理解但是实现起来比较复杂,有很多需要注意的细节,或者是一些所谓很”麻烦”的东西。 模拟题一般不涉及太难的算法,一般就是由较多的简单但是不好处理的部分组成…

.net使用excel的cells对象没有value方法——学习.net的Excel工作表问题

$exception {"Public member Value on type Range not found."} System.MissingMemberException 代码准备运行问题解决1. 下载别的版本的.net框架2. 安装3. 运行 代码 Imports Excel Microsoft.office.Interop.Excel Public Class Form1Private Sub Button1_Click(…

Adams Car——Adams car与Simulink联合仿真

1.修改悬架阻尼、刚度 ①先找到车辆悬架阻尼和刚度文件,这里以阻尼显示为例 ②修改阻尼曲线 找到对应车的文件 ③修改完后进行替换,刚度修改同理 2.转动惯量与车的质量修改

SQL server服务连接失败,通过端口1433连接到主机 localhost的 TCP/IP 连接失败

SQL server服务连接失败,通过端口1433连接到主机 localhost的 TCP/IP 连接失败 出现这个错误的时候,首先确保sql的服务正常启动 通常来说正常安装的SQL server之后,会自带一个软件 打开:SQL server配置管理器 确认一下红框内的…

单片机--数电(2)

组合逻辑电路 根基题目要求设计逻辑电路 组合逻辑电路 由一些逻辑门电路搭建,为实现某些功能的电路 特点 在任意时刻输出只取决于该时刻的输入,与电路原来的状态无关 根据图分析组合逻辑的方法 可以使用multisim的逻辑转换仪 1组合逻辑电路图 2…

C语言——自定义类型——结构体(从零到一的跨越)

目录 前言 1.什么是结构体 2.结构体类型的声明 2.1结构体的声明 2.2结构体的创建和初始化 2.3结构成员访问操作符 2.3.1结构体成员直接访问 2.3.2结构体成员的间接访问 2.4结构体变量的重命名 2.5结构体的特殊声明 2.6结构的自引用 3.结构体内存对齐 3.1对齐规则 3…

保护王国的钥匙:探索特权访问管理 (PAM) 的深度

在零信任架构的范例中,特权访问管理(PAM)正在成为网络安全策略的关键组成部分,旨在控制和监控组织内的特权访问。本文深入探讨了 PAM 在现代网络安全中的关键作用,探讨了其原理、实施策略以及特权访问的演变格局。 什么…

3.20作业

1、思维导图 2、 1> 创建一个工人信息库,包含工号(主键)、姓名、年龄、薪资。 2> 添加三条工人信息(可以完整信息,也可以非完整信息) 3> 修改某一个工人的薪资(确定的一个&am…

机器学习_聚类(Clustering)

文章目录 简介K-均值算法(K_Means) 简介 你经常跟哪些人联系,而这些人又经常给哪些人发邮件,由此找到关系密切的人群。因此,这可能需要另一个聚类算法,你希望用它发现社交网络中关系密切的朋友。 K-均值算法(K_Means) K-均值是…

Cesium新版修改源码后,编译不生效问题

最新版本的cesium源码在编译时默认使用node_models下的cesium/engine,从而导致咱们修改项目中的源码并不会生效 解决方式 : 进入到实际的源码位置,执行npm link 在返回到源码的根目录下执行 npm link ./packages/engine

​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结

接上次博客:Redis(四):持久化和事务:RDB(定期备份)【触发机制、流程说明、文件的处理、优缺点】、AOF(实时备份)【使用AOF、命令写入、文件同步、重写机制、启动时数据恢…

DEiT中如何处理mask数据的?与MAE的不同

在DeiT里面,是通过mask的方式,将maskunmasked的patches输出进ViT中,但其实在下游任务输入的patches还是和训练时patches的数量N是一致的(encoder所有的patches)。 而MAE是在encoder中只encoder未被mask的patches 通过…

蓝桥杯java组 螺旋折线

题目描述 如图所示的螺旋折线经过平面上所有整点恰好一次。 对于整点(X, Y),我们定义它到原点的距离dis(X, Y)是从原点到(X, Y)的螺旋折线段的长度。 例如dis(0, 1)3, dis(-2, -1)9 给出整点坐标(X, Y),你能计算出dis(X, Y)吗? 【输入格…

直播预告|Sora 会怎样驱动视频编解码领域的突破与革新

在数字化时代,视频内容的传播与消费已成为日常生活的一部分。视频编解码技术是数字媒体领域的一项核心技术,它影响着视频质量,传输速度以及观看体验。与此同时,视频产业正在经历一场由技术驱动的变革,Sora、AIGC 等相关…

通用组件封装——iconfont 封装图标组件

文章目录 背景一、iconfont 处理1. 一键添加入库功能2. 图标项目配置 二、代码实现 背景 在项目中会使用到大量的图标,而 element 等组件库现有的 icon 图标可能无法满足项目的需要,比如很多图标没有可以替代的,或者项目中有彩色图标的需求都…

前端VUE笔记整理

一:PDA H5 1、对于PDA用到的三个命令说明: npm install: 根据package.json安装依赖文件到node_modules文件夹下(如果是第一次可以删除此文件夹下的文件,这个目录不会上传) ​ npm run serve: 运行PDA程序在本地做客户端 ​ npm run build: 打包文件到d…

【CSP】2020-12-2 期末预测之最佳阈值 排序+差分+前缀和

2020-12-2 期末预测之最佳阈值 排序差分前缀和 索引2020-12-2 期末预测之最佳阈值 排序差分前缀和思路遇到的问题完整代码 索引 历年CSP认证考试真题题解总汇持续更新 2020-12-2 期末预测之最佳阈值 排序差分前缀和 这题并不算难,但也不是直接套公式那么简单&…

SpringBoot3框架,事件和监听器、SPI

事件和监听器 生命周期监听 自定义监听器的步骤: 编写SpringApplicationRunListener实现类(各个实现方法的功能写在其sout内) public class MyAppListener implements SpringApplicationRunListener {Overridepublic void starting(Configu…

git 安装、创建仓库、常用命令、克隆下载、上传项目、删除分支 -- 一篇文章总结

一、git安装 1、git安装地址:https://git-scm.com/downloads 2、选择操作系统 3、安装自己系统对应的操作位数 4、等待下载完,一路next安装就可以了 5、安装完成后,在任意文件夹点击右键,看到下图说明安装成功 二、创建仓库 1…

法语「奶奶」明明是阴性,为什么不用配合?柯桥法语口语学习小语种学校

咦,法语中“奶奶”到底怎么写?是Grande-mre还是Grand mre?又或者 Grand-mre ? 先写下你的回答,法语君再公布答案哦! 面对这个问题,你已经开始犹豫了对不对? 那么在法语中,到底哪一个…