C++面试3

一、常用设计模式

https://blog.csdn.net/m0_71530237/article/details/141140118?spm=1001.2014.3001.5501

二、死锁以及解决方式?

死锁:一种常见的并发问题,发生在多个进程或线程因为竞争资源而陷入相互等待的状态,导致这些进程或线程无法继续执行,要理解死锁,通常会涉及以下四个必要条件。

1、互斥条件:资源是不可共享的,即一个资源在同一时间只能被一个进程占用。

2、占有且等待:一个进程已经持有一个资源,同时又在请求其他资源,而此时这些资源正被其他进程占有。

3、不可剥夺:资源不能被强制剥夺,进程只能资源释放资源。

4、循环等待:存在一个进程集,这些进程之间形成一个循环的资源等待链。

死锁的解决方式

1、死锁预防:确保上诉四个条件中的至少一个不能成立,即可阻止死锁发生

2、死锁避免:使用某些算法来动态的判断资源分配状态,避免进入死锁状态,常见的方法是银行家算法

        银行家算法在进程请求资源时,判断系统是否会进入不安全状态。如果不会,则分配资源;否则拒绝该请求,防止死锁发生。

3、死锁检测与恢复:允许系统进入状态,然后检测和处理它。

4、资源有序分配:通过给资源定义一个全局顺序,进程只能按照顺序请求资源,避免循环等待的产生。

实践中的死锁解决方式

超时机制:当一个线程请求资源超过一定时间时,认为它可能处于死锁状态,释放已持有资源并重新开始请求。

锁分层:为不同资源定义不同的优先级和层级,线程只能按照优先级从低到高的顺序去请求资源,避免循环等待。

三、堆栈空间?堆和栈的区别?堆栈溢出问题?

1、栈

栈是操作系统为每个线程分配的一块连续内存空间,用于存储局部变量、函数参数、返回地址等。栈是一种后进先出(LIFO)的数据结构,具有自动管理内存的特点。

存储内容:局部变量、函数参数、返回地址、函数调用过程中的临时数据。

分配方式:栈的内存分配由操作系统自动完成,通常由编译器在函数调用时生成指令管理。

内存大小:站的大小是固定的,一般由操作系统在程序启动时确定。

优点:速度快,自动分配内存和释放,不容易产生内存泄漏。

缺点:大小优先,不能存储大数据;递归调用或过深的函数调用栈容易造成栈溢出。

栈的调用流程:

1、参数返回地址等数据会压入栈中。

2、在函数内部的局部变量也会存储在栈上。

3、函数返回时,栈顶数据(函数返回值和局部变量等)会被弹出,释放栈空间

2、堆

堆是操作系统提供的一块较大的动态空间,专门用于存储动态分配的数据,程序运行时可以通过动态内存分配函数(如malloc()、new)来手动管理堆内存。

存储内容:动态分配的内存快(如malloc()、new分配的内存)

分配的方式:由程序员手动分配和释放,灵活且可动态扩展。

内存大小:堆的大小不固定,通常由操作系统的物理内存决定,能够存储较大的数据。

优点:可以动态分配大内存快,灵活方便,数据生命周期可以跨越多个函数调用。

缺点:分配和释放的速度较慢,如果程序员忘记释放内存,容易造成内存泄漏;过多的动态分配也可能导致堆碎片问题,影响内存效率。

堆的调用流程:

1、使用malloc()或new函数分配内存。

2、返回一个指向这块内存的指针。

3、当不在需要时通过free()或delete释放内存,否则会发生内存泄漏。

栈与堆的比较:

特性
管理方式由操作系统自动管理需要程序员手动管理
存储内容局部变量、函数参数、返回地址等动态分配的对象和数组
分配速度快(内存连续,自动分配和释放)慢(需要寻找空闲内存、手动管理)
内存大小较小(通常几MB)较大(取决于系统可用物理内存)
生命周期随函数调用结束自动释放需程序员手动释放、否则会内存泄漏
使用场景局部变量、函数调用动态分配大数据或对象
常见问题栈溢出(如递归过深)内存泄漏、堆碎片

四、内存泄漏?如何避免?

内存泄漏是指程序在动态分配内存后,未能正确释放已不再使用的内存,导致该内存无法被再次分配和使用。随着程序的运行,未释放的内存逐渐增多,最终可能导致系统内存耗尽,引发系统崩溃或系统性能下降和。避免内存泄漏是编写高效、健壮系统的重要环节。

如何避免:

1、手动释放内存

2、避免重复分配内存

3、使用智能指针

五、智能指针的本质是什么?

智能指针本质上是一个类,用来存储指向动态分配对象的指针,负责动态释放动态分配的对象,防止内存泄漏。动态分配资源,交给一个类对象去管理,当类对象声明周期结束时,自动调用析构函数释放资源。借助RAII和类的特点,防止内存泄漏的问题。

六、野指针?

①、定义一个指针变量,没有给他指向有效的空间或置为空时,系统会默认初始化一个随机地址,变成野指针。②、释放一个指针变量指向的空间时,没有置为空,也会变成野指针。

避免野指针:

1、定义指针变量时,要么设为空,要么指向合法的内存

2、向指针变量指向的空间赋值时,一定要开辟内存空间,

3、开辟空间后需要检查是否分配成功

4、分配成功后要进行初始化

5、注意使用时不要越界访问,否则会产生内存泄漏

6、结束时要释放内存空间

7、释放完之后要将指针变量置为空

检测工具:

gcc自带的ASAN或valgrind工具

七、指针和引用的区别?

指针是一个变量,引用是变量的别名;指针可用为空,引用定义时必须初始化;指针在初始化之后可以改变指向,引用在初始化之后不可以改变指向;指针可以有多级,引用最多两级;指针需要动态分配内存空间,引用不需要动态分配;指针引用占8个字节;指针间接访问,效率低、,引用直接访问,效率高;做函数形参时,指针需要考虑传值还是传址,引用不需要考虑,它既可以访问,也可以修改,函数返回值是引用可以做左值;

八、C++三大特性?

封装:

封装是面向对象的核心思想,因为封装解决了代码独立性的问题,从而提高了代码的复用性,为复用性和扩展性提供了基础,封装将成员属性和成员方法绑定在一起,通过选择访问权限实现对外提供接口,对内开放数据从而达到对数据的保护,类内有构造函数和析构函数,不用去考虑释放,提供了一种更安全的机制,提高开发效率。

类封装的本质是在于将数据和行为绑定在一起,然后通过对象来完成操作,封装对私有函数添加get/set方法,全局变量会破坏数据的封装,可以采用静态成员来解决。

继承:

派生类可以使用基类的属性和方法,实现不同类之间的代码复用性,继承使得我们可以基于已有的类创建新的类,无需重新编写实现代码,派生类可以添加新的属性和方法,或重写(override)基类的方法来实现新的功能(通过重写虚函数virtual来实现)

基类提供属性和方法,派生类继承自基类并扩展或修改其行为

单继承 :一个派生类只能继承自一个基类

多继承  :一个派生类可以同时继承自多个基类

多态:

①多态是使用同一接口,传递不同实例对象,执行不同操作(C语言中的共用体就是一种多态)

②当功能不断变化,考虑用多态实现代码的扩展性

③静多态(编译时绑定)的函数重载和模板和动多态(运行时绑定)的虚函数(少用)

④基类中要有虚函数;派生类要重写基类中的虚函数(override);通过基类的指针或引用绑定派生类的对象

⑤优点,多态解决代码扩展性的问题,增加程序的灵活性,减轻系统升级、维护、调试的工作量和复杂度

缺点:多态影响效率,造成空间浪费(引入虚函数表指针)

九、重载、重写和隐藏?

重写:派生类中重新定义基类的虚函数,具有相同的函数签名,实现多态

重载:同一作用域内定义多个同名函数,但是他们的参数不同

隐藏:子类中定义了与父类具有相同名字但不同参数列表的函数,或子类中定义了与父类中非虚函数同名的函数,此时,父类中的同名函数在子类中被隐藏。子类的函数会覆盖父类的同名函数

十、this指针?

this指针是隐藏在对象成员函数内的一种指针,当一个对象被创建后,他的没有个成员函数都含有一个系统自动生成的隐含指针this,用于保存这个对象的地址,也就是说我们没有写上this指针,编译器在编译的时候也会加上。this永远指向当前对象,this指针并不是对象的一部分,不会影响sizeof(对象的大小)的结果。

this指针是C++实现封装的一种机制,他将对象和该对象调用的成员函数连接在一起,在外部看来,每一个对象都拥有自己的成员函数。一般情况下,不写this,而是让系统进行默认设置。

十一、局部变量和全局变量?

特性局部变量全局变量
作用范围尽在定义的函数或代码块内可见整个程序范围内可见
生命周期进入作用域时创建,离开作用域时销毁程序启动时创建,程序结束时销毁
存储位置栈内存全局数据区或静态存储区
初始化无默认初始值,使用前需手动初始化自动初始化为0或null
访问方式只能子啊定义他的函数或块内访问可被程序的任何地方访问(除非有限定)
冲突问题不会和其他函数中的局部变量冲突可能会与其他模块中的变量或函数名冲突

十二、进程间通信和线程间通信?

进程间通信:

传统通信:管道、信号

ipc通信:消息队列、共享内存、信号量

网络通信:socket(套接字)

线程间通信:

全局变量、条件变量、信号量、消息队列、事件、管道和文件

十三、多线程访问同步方式?

互斥锁:用于保护共享资源,确保同一时间只有一个线程能够访问该资源

读写锁:允许多个线程同时读取共享资源,但写操作需要独占资源

条件变量:用于在线程之间传递信号,允许一个线程等待条件满足后继续执行

信号量:一种计数器,用于控制对资源的访问

十四、线程池?

如何确保线程池中的任务能够按照顺序执行?

线程池不保证任务按照提交顺序执行,因为多个线程可能并发执行任务,如果需要严格的顺序控制,可以通过使用额外的同步机制(队列或条件变量)来管理任务的执行顺序

线程池中为什么不直接存储线程对象,而是存储指向线程的指针?

存储指向线程的指针可以避免对象的拷贝和移动操作,保证每个线程对象在创建后都能被正确管理和释放。如果存储线程对象本身,可能会引发不必要的拷贝构造和移动构造操作

线程池的作用是什么?他是如何提高多线程应用的性能?

线程池的主要作用是通过复用以创建的线程来执行任务,避免频繁创建和销毁线程开销,从而提高性能。线程池提前创建·一定数量的线程,当有任务时,线程池中的线程可以直接处理任务,避免了创建新线程的延迟

十五、connect连接方式?

网络编程中用于建立客户端和服务器端之间的连接的系统调用。它主要用于基于 TCP/IP 协议的套接字编程中,用于客户端连接到服务器

十六、TCP与UDP的区别?

十七、简单的数据结构?

https://blog.csdn.net/m0_71530237/article/details/141996354?spm=1001.2014.3001.5501

十八、槽函数的使用以及注意事项?

槽函数本质上是一个普通的成员函数,它可以被信号触发,槽函数的定义与普通函数类似,但是要放在slots:访问控制符之下,或通过Q_OBJECT宏使其成为槽函数。使用connect()函数将信号和槽连接起来。第一个参数:发送信号的对象;第二个参数:信号的名称;第三个参数:接收信号的对象;第四个参数:槽函数的名称,从QT5开始,可以使用lambda表示式,不需要定义一个单独的槽函数

注意事项:信号和槽默认线程安全;使用Q_OBJECT宏

十九、C++新特性

自动类型推导 (auto): 自动推导变量的类型,减少显式类型声明的繁琐

范围 for 循环: 用于遍历容器或数组,简化代码。

nullptrnullptr 取代 NULL,表示空指针,类型更明确。

lambda 表达式: 允许定义匿名函数,常用于 STL 算法或事件处理。

智能指针 (std::shared_ptrstd::unique_ptr): 引入了自动管理内存的智能指针,减少手动管理内存泄漏的风险

右值引用 (&&) 和移动语义: 移动语义允许资源的转移,而不是复制,提高了性能,特别是在容器操作中

线程支持 (<thread> 头文件): 引入了标准线程库,简化了多线程编程

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【运维监控】Prometheus+grafana监控flink运行情况

运维监控系列文章入口&#xff1a;【运维监控】系列文章汇总索引 文章目录 一、prometheus二、grafana三、flink配置修改四、prometheus集成grafana监控flink1、修改prometheus配置文件2、导入grafana模板3、验证 本示例通过flink自带的监控信息暴露出来&#xff0c;然后将数据…

提权——Linux

一、系统漏洞提权 #kali的nmap命令 nmap -O 目标ip 通过当前系统的内核版本搜索当前系统的漏洞&#xff0c;进行利用 搜索漏洞 对linux系统的漏洞进行利用&#xff08;脏牛、脏管道等&#xff09; 利用漏洞搜索工具&#xff0c;搜索当前系统是否存在一些漏洞 linux-exp…

人工智能学习

&#x1f310;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 &#x1f449;【点击跳转到网站&#xff1a;人工智能教程】 什么是人工智能&#xff1f;通俗来讲&#xff0c;就是让机器能像人一样思考。这…

vue3 5个常用的API

Vue3之于Vue2最大的变化&#xff0c;当属composition API了&#xff0c;而除了引入composition API外&#xff0c;一些我们在Vue2上经常使用的东西到了Vue3时也发生了不小的变化&#xff0c;本文将介绍一些有Vue2到Vue3中几个比较重要且常用的知识点。 Options API与Compositio…

世界主要国家跨境数据流动的政策法规及其启示

文章目录 前言一、主要国家加强跨境数据流动的监管措施二、全球跨境数据流动的关键问题三、中国跨境数据流动治理的不足与对策前言 随着数据成为全球经济发展的战略资源,各国政府正积极构建安全有效的治理体系,以扩大数据的社会和经济效益,探讨世界主要国家跨境数据流动的政…

3D云渲染农场为何怎么贵?主要消耗成本介绍

随着对高质量3D动画的需求持续增长&#xff0c;云渲染农场对于旨在以高效速度生产高质量视觉效果的工作室来说变得至关重要。然而&#xff0c;用户经常想知道为什么渲染农场的价格如此之高&#xff0c;理解背后的原因可以帮助艺术家做出更好的选择。 什么是云渲染农场&#xff…

基于Spring Boot的能源管理系统+建筑能耗+建筑能耗监测系统+节能监测系统+能耗监测+建筑能耗监测

建筑能耗数据采集器是一种采用嵌入式微计算机系统的建筑能耗数据采集专用装置&#xff0c;具有数据采集、数据处理、数据 存储、数据传输以及现场设备运行状态监控和故障诊断等功能。 下行具有2路RS485接口、2路RS485/RS232复用接口、1路MBUS接口&#xff0c;支持DL/T645、Modb…

深度学习经典模型之T5

T5(Text-to-Text Transfer Transformer) 是继BERT之后Google的又外力作&#xff0c;它是一个文本到文本迁移的基于Transformer的NLP模型&#xff0c;通过将 所有任务统一视为一个输入文本并输出到文本(Text-to-Text)中&#xff0c;即将任务嵌入在输入文本中&#xff0c;用文本的…

机器学习(西瓜书)第 4 章 决策树

4.1 决策树基本流程 决策树模型 基本流程 在第⑵种情形下&#xff0c;我们把当前结点标记为叶结点&#xff0c;并将其类别设定为该结点所含样本最多的类别&#xff1b;在第⑶种情形下&#xff0c;同样把当前结点标记为叶结点&#xff0c;但将其类别设定为其父结点所含样本最多…

Maven私服Nexus安装及使用

前言 周末在家闲着无聊&#xff0c;不知道做点啥&#xff0c;就想着自己搭建一个Maven私服来玩玩。刚好使用自己之前在电脑上搭建的虚拟机服务器来操作体验了一把。搭建好私服后&#xff0c;以后自己写的一些小模块啊&#xff0c;工具包啥的就可以发布到自己的私服上了&#xf…

2024网络安全人才实战能力白皮书安全测试评估篇

9月10日&#xff0c;国内首个聚焦“安全测试评估”的白皮书——《网络安全人才实战能力白皮书-安全测试评估篇》&#xff08;以下简称“白皮书”&#xff09;在国家网络安全宣传周正式发布。 作为《网络安全人才实战能力白皮书》的第三篇章&#xff0c;本次白皮书聚焦“安全测…

上海市高等学校信息技术水平考试 C程序设计(2020D场)全解

C语言程序一定是从mian函数开始的&#xff1b;在主函数中&#xff0c;一次又一次调用了其他函数&#xff0c;但不代表程序是在代码行的最后一个函数结束&#xff1b;而是在主函数中&#xff0c;遇到了return 0 才会程序结束。 标识符&#xff1a;在编程语言中&#xff0c;标识符…

Ubuntu下安装最新版本Apache2文件服务器

文章目录 1.最新版本Apache2安装2. Apache2配置2.1 端口配置2.2 创建软连接,生成文件服务2.3 隐藏Apache2服务版本号2.4 添加用户&#xff0c;设置Apache2文件服务密码2.5 重启Apache2服务 3. 执行后效果 1.最新版本Apache2安装 注意&#xff1a;安装最新版本必须升级Ubuntu为2…

【鸿蒙】HarmonyOS NEXT星河入门到实战6-组件化开发-样式结构重用常见组件

目录 1、Swiper轮播组件 1.1 Swiper基本用法 1.2 Swiper的常见属性 1.3 Swiper的样式自定义 1.3.1 基本语法 1.3.2 案例小米有品 2、样式&结构重用 2.1 Extend:扩展组件(样式、事件) 2.2 Styles:抽取通用属性、事件 2.3 Builder:自定义构建函数(结构、样式、事…

CentOS 7停更官方yum源无法使用,更换阿里源

CentOS 7官方源已经停止维护&#xff0c;导致无法使用yum更新软件。通过尝试使用阿里云、清华大学等第三方源解决&#xff0c;现以阿里云第三方源进行配置&#xff1a; 1、备份原有的yum源配置文件 # cp -a /etc/yum.repos.d /etc/yum.repos.d.bak 2、删除原有的yum源配置文…

基于鸿蒙API10的RTSP播放器(五:拖动底部视频滑轨实现跳转)

拖动前播放位置&#xff1a; 拖动后播放位置&#xff1a; 在Slider组件中&#xff0c;添加onChange方法进行监听&#xff0c;当视频轨道拖放结束时&#xff0c;触发this.seekTo()函数&#xff0c;其中seekTo函数需要传递一个视频已播放时长作为参数 Slider({ value: this.p…

基于Neo4j知识图谱的构建及可视化

基于Neo4j知识图谱的构建及可视化 前言 手把手教你基于Neo4j构建知识图谱可视化系统。有任何疑问或者需要提供帮助都可以私信我。 一、环境搭建 1.1 安装JDK 下载和安装Neo4j之前&#xff0c;首先必须 安装Java JDK&#xff0c;因为Neo4j是基于Java的图形数据库&#xff0c…

Model for OpenAI gym‘s Lunar Lander not converging

题意&#xff1a;OpenAI Gym 的 Lunar Lander 模型未收敛 问题背景&#xff1a; I am trying to use deep reinforcement learning with keras to train an agent to learn how to play the Lunar Lander OpenAI gym environment. The problem is that my model is not conver…

内网穿透的应用-Deepin系统安装x11vnc实现任意设备无公网IP远程连接Deepin桌面

文章目录 前言1. 安装x11vnc2. 本地远程连接测试3. Deepin安装Cpolar4. 配置公网远程地址5. 公网远程连接Deepin桌面6. 固定连接公网地址7. 固定公网地址连接测试 前言 本文主要介绍在Deepin系统中安装x11vnc工具&#xff0c;并结合Cpolar内网穿透工具实现任意设备无公网IP也可…

HTML深度探索 :img应用与实践

HTML深度探索 &#xff1a;img应用与实践 1、定义和用法2、图像格式3、常用属性4、预加载和懒加载4.1 预加载4.2 懒加载 1、定义和用法 HTML 元素 <img>将一张图像嵌入文档。 从技术上讲&#xff0c;实际上并没有将图像插入到网页中&#xff0c;而是将图像链接到了网页。…