C++:部分题目

news2024/9/26 1:24:07

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 ”表示未纯虚函数,无需定义无实际意义,仅仅作为基类描述派生类的接口,而含有纯虚函数的基类为抽象类,抽象类无法定义对象,其唯一的作用为派生派生类,而派生类实现继承的纯虚函数改为虚函数后,抽象类作为接口实现多态性

虚继承:

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SOLIDWORKS Simulation子模型分析的使用方法

子模型介绍 SOLIDWORKS Simulation的子模型基于圣维南原理。对于一个比较复杂的模型,如果想升级局部的应力计算精度,就需要对整个模型的网格进行调整并重新进行计算,整个过程耗时较长而且不容易得到满意的结果。 SOLIDWORKS Simulation的子…

【深度学习】训练Stable Diffusion环境

仓库: https://github.com/bmaltais/kohya_ss.git 基础镜像: from kevinchina/deeplearning:sdxllighting_trt_nginx_002api docker run --net host --gpus device0 -e APIWORKS1 -it t1:t1 bash构建环境: sudo -i git clone https://git…

面试常问:为什么 Vite 速度比 Webpack 快

前言 最近作者在学习 webpack 相关的知识,之前一直对这个问题不是特别了解,甚至讲不出个123....,这个问题在面试中也是常见的,作者在学习的过程当中总结了以下几点,在这里分享给大家看一下,当然最重要的是…

【MySQL配置】Windows环境下载并安装MySQL数据库(内含图片,保姆级指引)

一、下载自身所需Mysql 官网链接:https://dev.mysql.com/downloads/installer/ 点击Download后,跳转如下页面。你可以点击注册一个谷歌账号(不是硬性要求),或者直接如图开始下载。 二、安装所下载的版本 1、双击下载的MySQL文件 2、选择…

深入理解与实践AB测试:从理论到实战案例解析

一、引言 在互联网产品优化和运营策略制定中,AB测试(也称为分组测试或随机化对照实验)是一种科学且严谨的方法。它通过将用户群体随机分配至不同的实验组(通常是A组和B组),对比不同版本的产品或策略对关键…

MySQl基础入门⑫

上一遍文章内容 查询时选择行 1.查询指定记录 假设students表包含字段name, major, 和 email,我们可以构造一个查询来找出所有专业为“计算机科学”且邮箱中包含"university.edu"的学生姓名和邮箱: SELECT name, email FROM students WHER…

种植新革命:科技赋能绿色未来

《种植新革命:科技赋能绿色未来》 一、种植技术的颠覆式创新 随着科技的飞速发展,种植技术也在经历一场颠覆式的创新。传统的种植方式,虽然历史悠久,经验丰富,但在面对现代化、大规模、高效的需求时,逐渐…

一分钟带你入门Selenium入门!【建议收藏】

Selenium入门 欢迎阅读Selenium入门讲义,本讲义将会重点介绍Selenium的入门知识以及Selenium的前置知识。 自动化测试的基础 在Selenium的课程以前,我们先回顾一下软件测试的基本原理,为我们进一步完成Selenium自动化测试做好准备。 软件…

解决GNURadio自定义Python OOT块-导入块时报错问题

文章目录 前言一、问题描述二、解决方法1、卸载已安装的 OOT 块2、重新编译及安装3、重新测试 前言 本文记录在 GNURadio 自定义Python OOT 块后导入块时报错 ModuleNotFoundError: No module named xxx。 一、问题描述 参考官方教程 Creating Python OOT with gr-modtool 创…

【ppt技巧】PPT转换为图片,方法有哪些?

想要将ppt文件转换为图片,其实很简单,一起来看一下如何操作吧! 方法一: 使用格式转换器,有些文件格式转换器,支持ppt转换为图片。 方法二: 不需要转换器,直接在ppt中进行操作即可…

linux上安装locust并进行压测demo

我的linux服务器上有两个python版本 使用python3 pip3 install locust 过程中有一些报错 第一个报错 gcc: error trying to exec cc1plus: execvp: No such file or directoryerror: command gcc failed with exit status 1第二个报错 src/greenlet/greenlet_refs.hpp:181:19…

数据库:基本操作与用户授权

一 基本操作 1 SQL分类 数据库:database 表:table,行:row 列:column 索引:index 视图:view 存储过程:procedure 存储函数:function 触发器:trigger 事…

文件操作:文本文件(写/读)

文件操作可以将数据永久化&#xff0c;C中对文件操作需要包含头文件 < fstream > 文件类型分为两种&#xff1a; 1. 文本文件&#xff1a;文件以文本的ASCII码形式存储在计算机中 2. 二进制文件&#xff1a;文件以文本的二进制形式存储在计算机中&#xff0c;…

理解计算属性等

计算属性 计算属性的作用是将写在computed内的写了对应的属性名&#xff0c;属性值都是函数&#xff0c;将这属性值的函数调用之后的返回值赋给属性名的变量。因此其实计算属性内的是值&#xff0c;不是方法&#xff0c;因此写插值等语句是只是写变量&#xff0c;而不是调用。且…

电气接点在线测温解决方案--ARTM电气接点在线测温装置

ARTM系列电气接点在线测温装置适用于高低压开关柜内电缆接头、断路器触头、刀闸开关、高压电缆中间头、干式变压低压大电流等设备的温度监测&#xff0c;防止在运行过程中因氧化、松动、灰尘等因素造成接点接触电阻过大而发热成为安全隐者、患&#xff0c;提高设备安全保障&…

Linux 磁盘的一生

注意&#xff1a;实验环境都是使用VMware模拟 ​ 磁盘接口类型这里vm中是SCSI&#xff0c;扩展sata,ide(有时间可以看看或者磁盘的历史) ​ 总结&#xff1a;磁盘从有到无—类似于建房子到可以住 ————————————————————————————————————…

【MyBatis】in根据查询的顺序返回结果

目标效果&#xff1a;根据in中元素的顺序返回结果 查询id为&#xff08;2&#xff0c;4&#xff0c;1&#xff0c;3&#xff09;的数据&#xff0c;并按此顺序返回 第一次尝试 select id, name from tb_shop where id in (2, 4, 1, 3);期待效果 实际效果 正确的语句 select …

Chrome浏览器扩展插件开发

manifest.json: {"manifest_version": 3,"name": "ChatGPT学习","version": "0.0.1","description": "ChatGPT,GPT-4,Claude3,Midjourney,Stable Diffusion,AI,人工智能,AI","icons": {&quo…

Effect:由渲染本身引起的副作用

React 组件中的两种逻辑类型&#xff1a; 渲染逻辑代码 位于组件的顶层&#xff0c;接收 props 和 state&#xff0c;进行转换&#xff0c;返回屏幕上看到的 JSX&#xff0c;只计算不做其他任何事情&#xff1b;事件处理程序 嵌套在组件内部的函数&#xff0c;由特定的用户操作…

一句命令解决huggingface.co无法下载模型问题

血来潮从github上下载的模型&#xff0c;在运行demo点批发的时候&#xff0c;发现大模型并不能直接从huggingface上直接下载&#xff0c;这是因为众所周知的网络问题。 其实只要一句命令就可以解决这个问题。 export HF_ENDPOINThttps://hf-mirror.com修改HF_ENDPOINT系统变量…