C++面试3

news2024/11/16 17:38:18

一、常用设计模式

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.coloradmin.cn/o/2133732.html

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

相关文章

199.二叉树的右视图(两种方法实现)

一、题目 思路1 对于一个任意给定的二叉树&#xff0c;我们不能确定二叉树的形状&#xff1b; 设计一个每次遍历二叉树的右子树的深度优先遍历&#xff0c;这样深度优先遍历中每层遍历到的第一个结点就是最右边的结点&#xff1b; 代码实现大致分为四部分&#xff1a; 哈希…

error:Framework ‘Pods_xxx‘ not found解决方法

报错“Framework Pod_xxx.framework找不到”通常意味着你的项目正在尝试链接或使用一个名为Pod_xxx.framework的框架&#xff0c;但是这个框架并没有被正确地添加到项目中。 解决办法&#xff1a; 1.点击项目蓝色图标&#xff0c;在左侧Target部分&#xff0c;点击你当前的项…

Maven从入门到精通(三)

一、Settings 配置 settings.xml 用来配置 maven 项目中的各种参数文件&#xff0c;包括本地仓库、远程仓库、私服、认证等信息。 全局 settings、用户 setting、pom 的区别&#xff1a; 全局 settings.xml 是 maven 的全局配置文件&#xff0c;一般位于 ${maven.home}/conf…

如何进行大模型训练和微调?(实战)

1、在项目中&#xff0c;如果prompt和function calling足够好&#xff0c;尽量不要微调&#xff0c;节约成本。 以下是针对function calling的slot&#xff0c;评估准确率&#xff08;识别准确度&#xff09;、召回率&#xff08;全面率&#xff09;&#xff0c;F1值。 从中可以…

error: subprocess-exited-with-error

error: subprocess-exited-with-error 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市开发者社区主理人 擅长.net、C、…

论文速递! Attention-LSTM特征融合,用于剩余使用寿命(RUL)预测

论文标题&#xff1a;Machine Remaining Useful Life Prediction via an Attention-Based Deep Learning Approach 期刊信息&#xff1a;IEEE TIE (中科院1区, JCR Q1 TOP, IF7.5) 引用&#xff1a;Chen Z, Wu M, Zhao R, et al. Machine remaining useful life prediction v…

借助Aspose.Email、用C# 渲染 HTML 格式 电子邮件

对于构建电子邮件通信应用程序的开发人员来说&#xff0c;电子邮件渲染对于确保通过应用程序发送的电子邮件在不同的电子邮件客户端、设备和设置中正确且一致地显示至关重要。 为了有效地执行此任务&#xff0c;Aspose.Email for .NET提供了多种功能&#xff0c;用于格式化和自…

C++ Primer Plus(速记版)-容器和算法

第九章 顺序容器 容器是存储特定类型对象的集合&#xff0c;标准库提供了多种容器类型以支持不同的使用场景。其中&#xff0c;顺序容器&#xff08;如vector、list、deque&#xff09;根据元素添加到容器中的顺序来存储和访问元素&#xff0c;与元素值无关。 这些顺序容器各有…

昆仑通态触摸屏——历史曲线XY轴调节功能

目录 1、添加参数 2、规划界面 3、编写脚本 4、结果演示 前言 在工程中有时会遇到因环境等变化而导致参数波动较大&#xff0c;对于这种参数我们想要在触摸屏中直观地看到变化的趋势&#xff0c;就需要比较大的显示屏或者可调节的曲线显示。但是在历史曲线的设置中没有直接…

MySQL底层为什么选择用B+树作为索引

首先&#xff0c;我们来想想为什么这么多数据结构&#xff0c;为什么要用树这种数据结构&#xff1f; 众多的数据结构在逻辑层面可分为&#xff1a;线性结构 和 非线性结构。 线性结构有&#xff1a;数组、链表&#xff0c;基于它们衍生出的有哈希表&#xff08;哈希表也称散…

01_Python基本语法

Hello Python 与其他编程一样&#xff0c;第一个程序都是输出Hello World!。 print("Hello World!")print() 函数由两部分构成 &#xff1a; 指令&#xff1a;print指令的执行对象&#xff0c;在 print 后面的括号里的内容 Hello World!。 Python程序的执行流程如…

JS - 获取剪切板内容 Clipboard API

目录 1&#xff0c;需求最终效果 2&#xff0c;实现示例 3&#xff0c;注意点1&#xff0c;只支持安全上下文环境2&#xff0c;只能读取当前页面的剪切板3&#xff0c;权限获取问题4&#xff0c;获取内容的 MIME_TYPE 问题1&#xff0c;文本内容2&#xff0c;图片内容 5&#x…

深入MySQL的索引实践及优化

文章目录 一、什么是索引二、数据结构——为什么是B树平衡二叉查找树红黑树B树&#xff08;多叉&#xff09;B树&#xff08;多叉&#xff09; 三、MySQL索引实战1.索引创建(1)自动创建索引(2)手动创建非聚簇索引(3)索引的代价 2.B树索引原则&#xff08;1&#xff09;等值匹配…

make 程序规定的 makefile 文件的书写语法(4)

&#xff08;29&#xff09;接着学习 make 支持的变量追加操作&#xff0c; &#xff0c; 在变量的原有字符串的基础上&#xff0c;再追加字符串&#xff0c;并用一个空格隔开&#xff1a; &#xff08;30&#xff09;再学习 make 的语法&#xff0c;shell 运行赋值&#xff1…

关于Redis缓存一致性问题的优化和实践

目录标题 导语正文分布式场景下无法做到强一致即使是达到最终一致性也很难缓存的一致性问题缓存是如何写入的 如何感知数据库的变化最佳实践一&#xff1a;数据库变更后失效缓存最佳实践二&#xff1a;带版本写入 总结与展望阿里XKV腾讯DCache 导语 Redis缓存一致性的问题是经…

大模型→世界模型下的「认知流形」本质·下

本篇内容节选自今年初我撰写的那篇10万的文章《融合RL与LLM思想&#xff0c;探寻世界模型以迈向AGI》&#xff0c;其观点也是文章中核心中的核心。 想进一步完整阅读的小伙伴可关注评论&#xff0c;节选内容如下↓ 接上篇..“因此当前无论对先验自回归学习下的LLMs也好还是未来…

ASR(自动语音识别)识别文本效果的打分总结

ASR(自动语音识别)识别文本效果的打分总结 1. 词错误率(WER, Word Error Rate)2. 字正确率(W.Corr, Word Correct)3. 编辑距离(Edit Distance)4. 特定错误率5. 句子错误率(SER, Sentence Error Rate)6. 基于模型的评估方法对于ASR(自动语音识别)识别文本效果的打分…

【python】python中非对称加密算法RSA实现原理与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

9.13 DFSBFS 简单 101 Symmetric Tree 104 Maximum Depth of Binary Tree

101 Symmetric Tree class Solution { public:// 比较两个向量是否镜像对称bool isIdentical(const std::vector<int>& n1, const std::vector<int>& n2) {int n n1.size();for (int i 0; i < n; i) {if (n1[i] ! n2[n - i - 1]) return false; // 镜…

AV1 Bitstream Decoding Process Specification--[2]:符号和缩写术语

原文地址&#xff1a;https://aomediacodec.github.io/av1-spec/av1-spec.pdf没有梯子的下载地址&#xff1a;AV1 Bitstream & Decoding Process Specification摘要&#xff1a;这份文档定义了开放媒体联盟&#xff08;Alliance for Open Media&#xff09;AV1视频编解码器…