C++面试速通宝典——27

504. 孤儿进程和僵尸进程是什么?怎么处理?

孤儿进程:当一个父进程结束,而他的一个或多个子进程还在运行时,那些子进程将成为孤儿进程。孤儿进程会被init进程(进程ID为1)自动领养,init进程会负责调用wait()来收集他们的退出状态

僵尸进程:当一个子进程结束,在其父进程没有调用wait()或waitpid()获取子进程的状态信息之前,该子进程将变成僵尸进程。僵尸进程占用资源很小,但如果大量累计可能导致进程ID耗尽。

处理方法:

  1. 孤儿进程不需要手动处理,他们会被操作系统处理。
  2. 僵尸进程需由父进程通过wait()或waitpid()来处理和回收资源。如果父进程不做处理,可以试图用SIGCHLD信号提醒父进程处理僵尸进程,或者重启父进程。如果僵尸进程的父进程已经结束,那么这些僵尸进程将有init进程回收。

505. 计算机网络中的长连接和短连接

长连接:在客户端和服务端建立连接后,如果不主动断开,这个连接将会保持活动状态,多次通信可以复用同一个连接。长连接减少了频繁建立连接的开销,适用于需要频繁交换数据的场景

短连接:每次通信都需要新建一个连接,数据传输完成后立即断开。短连接适用于请求-响应模式的通信,适合偶尔交换数据的场景。相较于长连接,他跟简单,但在高频通信时会增加额外的开销。

506. TIME_WAIT和CLOSE_WAIT的区别

TIME_WAIT: 是TCP连接被动关闭(接收到对方发送的FIN报文)并发送了ACK后的状态。此状态通常等待一段时间以确保对方接收到了确认的ACK报文,通常是2MSL(最长报文段生存时间)。

CLOSE_WAIT: 是当一方接收到对方的FIN报文,发送了ACK响应,但本地应用程序还没有调用close关闭连接时的状态,这意味着等待本地程序关闭连接。

507. 栈的概念和应用

‌‌‌‌  栈是一种后进先出的数据结构,只能在一端(栈顶)进行添加数据(压栈)和移除数据(弹栈)的操作。

应用:

  1. 函数调用的管理:保存函数返回点和局部变量。
  2. 表达式求值:编译器中用于计算后缀表达式。
  3. 撤销操作:编辑器中的撤销操作通常用栈实现。
  4. 页面导航历史:浏览器后退按钮的实现。

508. 堆的概念和应用,对堆的理解

‌‌‌‌  堆是一种通常被实现为二叉树的数据结构,它满足父节点的键值总是大于或小于子节点的键值(最大堆或最小堆)。它允许快速的插入新数据和删除最大或最小的元素。

应用:

  1. 优先队列:快速访问和删除最高或最低优先级的元素。
  2. 堆排序:利用堆的性质进行高效的排序操作。
  3. 图算法:比如在Dijkstra和Prim算法中用于快速查找最小边。
  4. 动态数据集合的管理:动态的添加和删除集合中的元素。

509. 哈希表的概念和应用

‌‌‌‌  哈希表是一种通过哈希函数将键(key)映射到表中一个位置来访问记录的数据结构,以支持快速的插入和删除操作。

应用:

  1. 字典:存储键值对,允许快速的键查询。
  2. 缓存:例如网页缓存或数据缓存,提供快速的数据检索。
  3. 数据库索引:提高数据库查询效率。
  4. 集合:实现集合数据结构,进行快速的成员检查。

510. 哈希表碰撞的概念以及如何解决

哈希表碰撞是指两个不同的键经过哈希函数处理后得到相同的哈希值,导致他们在哈希表中定位到同一个位置。

解决方法包括:

  1. 链接法:在哈希表的每个索引位置维护一个链表,发生碰撞时将元素添加到链表中。
  2. 开放地址法:发生碰撞时,按照某种探测序列在哈希表中寻找空位。
  3. 双重哈希:使用第二个哈希函数来决定探测序列。
  4. 增大哈希表:扩展哈希表的大小以减少碰撞概率。

511. 哈希表的种类

哈希表的种类主要包括:

  1. 直接寻址法:当键的范围很小且连续时,可以直接使用键作为数组索引。
  2. 链地址法哈希表:通过链表来解决冲突,每个索引处存储一个链表。
  3. 开放寻址哈希表:在表内寻找空闲位置来解决冲突,常见的探测方式有线性探测、二次探测和双重哈希。
  4. 完全哈希表:先用一个哈希函数将键分配到多个桶中,然后对每个桶使用另一个哈希函数进行再哈希,以减少冲突。
  5. 一致性哈希表:特别适用于分布式系统,通过一致性哈希算法保证节点的增减对系统影响最小。

512. OSI七层模型

  1. 物理层:负责原始数据的传输,如光纤、电缆等。
  2. 数据链路层:处理数据帧的寻址、错误检测和改错。
  3. 网络层:负责数据包的路由和转发。
  4. 传输层:确保数据完整性和有效传输,如TCP/UDP协议。
  5. 会话层:管理用户会话和对话控制。
  6. 表示层:处理数据的表示、加密和压缩。
  7. 应用层:为应用软件提供网络服务。

513. TCP当中的粘包和拆包的概念以及如何解决这两类问题

TCP中的粘包和拆包是因为TCP是基于字节流的,没有固定边界:

  1. 粘包 : 多次发送的数据被合并成一次接收
  2. 拆包 : 一次发送的数据被分成多次接收

解决方法:

  1. 定长包:每个包的大小固定,接收方按照固定长度接收数据。
  2. 包头加长度:每个包的开始部分增加表示数据长度的信息,接收方先读取这部分的信息,再根据长度读取整个包。
  3. 结束符:在包尾添加结束符,接收方通过这个字符判断包的终点。

514. MySQL中的varchar和char的概念以及区别

varchar和char是MySQL中用于存储字符串的两种数据类型。

  1. char : 是固定长度的字符串,当存储的字符串长度小于定义的长度时,会使用空格填充余下的空间;检索时会去除这些空格。适合存储长度几乎不变的数据。
  2. varchar:是可变长度字符串,只占用必要的存储空间(加上一个额外的用于记录长度的字节或两个字节)。适合存储长度可变的数据。

区别在于存储方式和空间效率。char适合存储长度固定的字段,而varchar更节省空间,用于长度不固定的字段。

515. 删除表的方式有哪几种?

删除MySQL表的主要方式有以下几种:

  1. DROP TABLE : 直接删除表结构及其数据,无法恢复。
  2. TRUMCATE TABLE : 删除表中的数据,重置自增计数器,但保留表结构。
  3. DELETE TABLE : 删除表中的全部或部分数据行,可以使用 WHERE 子句指定条件,保留表结构和自增计数器的当前值。

516. MySQL的索引类型

MySQL中的主要索引包括:

  1. 按照功能分类:

    1. PRIMARY KEY(主键索引):唯一标识表中的每行数据,不能为NULL。
    2. UNIQUE(唯一索引):确保数据列中的每个值都是唯一的。
    3. INDEX(普通索引):加速数据的检索速度。
    4. FULLTEXT(全文索引):用于全文检索。
  2. 按照数据结构分类:

    1. B+树索引
    2. 哈希索引
  3. 按照存储位置分类:

    1. 聚簇索引
    2. 非聚簇索引

517. MySQL的行锁有哪些特点和类型

MySQL的行锁特点包括:

  1. 粒度小,仅锁定单个或部分行,减少锁竞争
  2. 支持高并发事务处理
  3. 可以防止脏读、不可重复读和幻读(取决于事务隔离级别)。

MySQL行锁的类型主要有:

  1. 共享锁(S锁):允许事务读一行数据。
  2. 排他锁(X锁):允许事务删除或更新一行数据。
  3. 意向锁:表明事务想要在表中的某些行上获取共享锁或排他锁,分为意向共享锁(IX)和意向排他锁(IS)。

518. MySQL中死锁的产生原因和处理机制

产生原因:

  1. 多个事务同时锁定不同资源后,又请求对方已锁定的资源,形成循环等待
  2. 索引不足导致全表扫描,增加锁竞争
  3. 插入,更新操作导致的锁升级
  4. 事务隔离级别较高,增加所的范围和时间

处理机制:

  1. 超时机制:设置事务等待锁的最大时间,超时后事务自动回滚。
  2. 死锁检测:MySQL会不断检测事务等待图中是否存在环,发现死锁立即回滚其中一个事务来进行破坏环。
  3. 主动回滚:用户可以选择主动回滚事务来解除死锁。
  4. 减少锁粒度:优化SQL,减少一次事务中锁定的数据量,降低死锁发生概率。

519. 操作系统中内存分页和分段的概念以及区别

内存分页和分段是操作系统中两种不同的内存管理机制。

分页(Paging):

  1. 概念:将物理内存分为固定大小的页,虚拟内存也分为同样大小的页。一个页表用于映射虚拟页到物理页。
  2. 区别:透明于用户,用户程序看不到分页的存在。

分段(Segmentation):

  1. 概念:将虚拟内存划分为逻辑上的段,每个段有其意义(如函数、数组等),段表实现虚拟段到物理内存的映射。
  2. 区别:分段是可见的,即用户定义了段的大小和内容。

两者的区别主要在于:

  1. 分页是物理内存的映射技术,而分段是逻辑上对内存的划分。
  2. 分页有固定大小、分段大小不一,依据程序逻辑结构而定。
  3. 分段能够更好地反映程序的逻辑结构,而分页主要解决内存碎片和扩展问题。
  4. 分页管理简单,CPU加载时不必了解数据意义,分段管理复杂但方便程序片段的保护和共享。

520. 操作系统中I/O多路复用的概念和工作原理

‌‌‌‌  I/O多路复用是指操作系统中可以在一个进程内同时处理多个Socket网络I/O操作的技术。它允许多个I/O操作同时阻塞在一个系统调用上,从而提高处理并发I/O的效率。

工作原理如下:

  1. 应用程序将需要监听的文件描述符(通常是socket)注册到I/O多路复用函数(如select、poll、epoll)上。
  2. 当有数据到达或连接关闭等事件发生时,操作系统将唤醒阻塞在I/O多路复用函数上的进程或线程。
  3. 应用程序遍历多路复用函数提供的就绪文件描述符列表进行相关处理

I/O多路复用的优势在于使用单个线程处理多个I/O事件,减少了线程的创建和销毁开销,提高了I/O并发的处理能力。

521. C++多态性如何体现?模板怎么实现的多态?

C++中的多态性主要通过两种方式体现:虚函数(动态多态性)和模板(静态多态性)。

  1. 虚函数实现的多态性:通过基类指针或者引用,调用由不同的派生类重载的虚函数,实现在运行时根据对象的实际类型调用相应的函数处理,这被称为动态多态。
  2. 模板实现的多态性:模板通过允许函数或类操作泛型类型,实现在编译时根据使用的实际类型生成具体的函数或实例,这被称为静态多态。模板多态不依赖于继承体系,因此提供了一种更为灵活的多肽实现方式。

522. 在C++的多继承里面,怎么知道调用的方法和属性属于哪一个父类?

‌‌‌‌  如果需要指定调用特定父类的方法或者属性,应在方法或属性名称前加上相应的父类的名称,使用作用域解析操作符(::)

523. C++指针和智能指针的区别?智能指针的实现原理是什么?指针和函数指针的区别?

  1. 指针和智能指针的区别:指针是C++的核心特性,用于存储对象的内存地址。使用时需要手动分配和释放内存,否则会导致内存泄漏等问题。智能指针则是一种对象,像常规指针一样,可以指向另一个对象,但它包含更加完善的内存管理机制,可以自动释放它所指向的资源,减少内存泄露和其他相关错误。
  2. 智能指针的实现原理:智能指针的实现主要基于RALL概念。其主要含义是,将一个对象的生命周期(从初始化到销毁)与某项资源的获取和释放(如内存、文件描述符、锁等)绑定起来。当对象销毁时,其对应的资源也随之被释放。例如,shared_ptr智能指针通过引用计数来管理资源,但没有任何指针引用该资源时,资源会被自动释放。
  3. 指针和函数指针的区别:指针是指向一个内存地址的变量,用于存储和访问对象的地址。函数指针是指向函数的指针,它可以用于调用函数或传递函数作为参数。

524. C++什么时候可能出现内存泄漏?如何定位到内存泄漏?

C++可能出现内存泄漏的情况包括但不限于:

  1. 动态分配的内存没有被正确释放,例如使用new分配内存后没有使用delete释放。
  2. 资源分配和释放之间程序提前退出(如异常抛出)导致释放代码未执行。
  3. 指针变量被覆盖,导致原有的内存地址丢失而无法释放。
  4. 在程序数据结构中的循环引用,特别是在智能指针未正确使用时。

定位内存泄露的方法有:

  1. 利用C++标准库中的< memory >头文件,使用智能指针如std::unique_ptr和std::shared_ptr以帮助自动管理内存。
  2. 使用内存管理工具,如Valgrind、AddressSanitizer等,他们可以在程序运行时检测内存泄漏。
  3. 在代码中使用断言和监测,追踪动态内存的分配和释放。

525. 析构函数必须是虚函数么?

‌‌‌‌  析构函不是必须声明为虚函数,但如果你的类是多态基类,即预期会被其它类继承,并且通过基类指针或引用来删除派生类对象,那么你应该将析构函数声明为虚函数。这确保了对象的正确析构,触发动态绑定,以调用适当的派生类析构函数。如果不这么做,在通过基类指针删除派生类对象时,可能会导致资源泄露或未定义的行为。

526. new和malloc申请内存有什么差别?

  1. new是C++中的操作符,malloc是C中的函数。
  2. new不仅分配内存,还会创建对象(即会调用构造函数),而malloc只分配内存,不会初始化内存。
  3. new直接返回指定类型的正确指针,无需类型转换,而malloc返回void*,在使用前需要转换为正确的类型。
  4. 与new配套的是delete,与malloc配套的是free。
  5. 如果内存分配失败,new会抛出bad_alloc异常,而malloc返回NULL。
  6. 可以重载new和delete,但不能重载malloc和free。

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

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

相关文章

2010年国赛高教杯数学建模C题输油管的布置解题全过程文档及程序

2010年国赛高教杯数学建模 C题 输油管的布置 某油田计划在铁路线一侧建造两家炼油厂&#xff0c;同时在铁路线上增建一个车站&#xff0c;用来运送成品油。由于这种模式具有一定的普遍性&#xff0c;油田设计院希望建立管线建设费用最省的一般数学模型与方法。   1. 针对两炼…

在线考试系统的现代化解决方案:Spring Boot与JavaWeb

3系统分析 3.1可行性分析 通过对本基于JavaWeb技术的在线考试系统设计与实现实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本基于JavaWeb技术的在线考试系统设…

10 排序算法:冒泡排序与快速排序(算法原理、算法实现、时间和空间复杂度分析)

目录 1 十大常见的排序算法 1.1 算法的稳定性 2 冒泡排序 2.1 算法原理 2.2 算法实现 2.3 时间空间复杂度分析 2.3.1 时间复杂度分析 2.3.2 空间复杂度分析 3 快速排序 3.1 算法原理 3.1.1 排序思想 3.1.2 递归过程 3.2 示例 3.2.1 示例 1 3.2.2 示例 2 3.2.3 …

设计一个支持自动化测试执行的测试框架

设计一个支持自动化测试执行的测试框架 在现代软件开发中,自动化测试是确保软件质量的重要手段。一个良好的测试框架不仅可以提高测试效率,还能帮助开发团队快速发现和修复缺陷。本文将介绍如何设计一个支持自动化测试执行的测试框架,涵盖框架的基本结构、核心功能以及实现…

JAVA 中系统相关的类

System 类 代表的是当前 Java 程序运行的平台&#xff08;操作系统&#xff09;&#xff0c;该类被关键字 final 修饰&#xff0c;即该类不能够派生子类&#xff0c;同时该类的构造器被关键字 private 修饰&#xff0c;因此不能够创建 System 类型的实例对象。 System 类中定…

【数据采集工具】Sqoop从入门到面试学习总结

国科大学习生活&#xff08;期末复习资料、课程大作业解析、大厂实习经验心得等&#xff09;: 文章专栏&#xff08;点击跳转&#xff09; 大数据开发学习文档&#xff08;分布式文件系统的实现&#xff0c;大数据生态圈学习文档等&#xff09;: 文章专栏&#xff08;点击跳转&…

【DNF mysql8.0安装】DNF安装MySQL服务器教程

在基于Red Hat的Linux发行版中&#xff0c;如CentOS或Fedora&#xff0c;DNF&#xff08;Dandified Yum&#xff09;是包管理器&#xff0c;用于安装、更新和卸载软件包。以下是使用DNF安装MySQL服务器&#xff08;也称为MySQL Community Server&#xff09;的步骤&#xff1a;…

网易博客旧文----Xtreme ToolkitPro 的CommandBarsDesigner编辑生成的界面如何使用

Xtreme ToolkitPro 的CommandBarsDesigner编辑生成的界面如何使用 2013-03-04 17:22:42| 分类&#xff1a; MFC | 标签&#xff1a; |举报 |字号大中小 订阅 著名的界面开发商Codejock Software开发的MFC界面控件和BCGsoft公司开发的BCGControlBarPro界面有得一拼。 codejock…

SpringBoot整合Freemarker(一)

Freemarker和jsp一样是一个视图的引擎模板&#xff0c;其实所有的模板引擎的工作原理都是类似的&#xff0c;如下图&#xff1a; 接下来就具体讲解一下Freemarker的用法&#xff0c;参考手册&#xff1a;模板 数据模型 输出 - FreeMarker 中文官方参考手册 SpringBoot默认就…

Agentic RAG(基于智能体的检索增强生成)是检索增强生成(Retrieval-Augmented Generation,RAG)技术的一种高级形式

Agentic RAG&#xff08;基于智能体的检索增强生成&#xff09;是检索增强生成&#xff08;Retrieval-Augmented Generation&#xff0c;RAG&#xff09;技术的一种高级形式&#xff0c;它通过引入人工智能代理&#xff08;Agent&#xff09;的概念&#xff0c;为语言模型赋予了…

本地项目上传Github+Gitee上传特定分支到Linux服务器(自用)

一、本地项目上传Github 上传整个项目到一个全新的repositories 或者 上传一个文件到一个特定的分支 步骤 1: 在本地创建 Git 仓库 在项目的根目录下运行以下命令&#xff0c;初始化本地 Git 仓库&#xff1a; git init步骤 2: 添加文件到 Git 仓库 使用以下命令将所有文件…

vite server正则表达式

vite server支持正则表达式&#xff0c;这样可以在测试时将一些请求模拟转发到本地后端服务的端口。且不会出现跨域的问题。 例如下面的配置&#xff0c;解决了3个问题&#xff1a; 1&#xff09;API请求URI地址转发到本地后端服务 2&#xff09;文件资源路径转发到本地后端服…

微前端架构及其解决方案对比

微前端架构及其解决方案对比 微前端架构是一种通过将大型前端应用拆分为多个独立的、可单独部署的小型应用的设计模式。随着这种模式的流行&#xff0c;诞生了多种微前端实现方案&#xff0c;每个方案都有其独特的特点和适用场景。以下是常见的微前端解决方案及其优缺点对比&a…

Socket 网络编程与 C# 中的应用实例

一、引言 在当今数字化时代&#xff0c;网络编程成为构建各种分布式应用和实现设备间通信的关键技术。Socket 网络编程作为一种底层且强大的网络通信方式&#xff0c;为开发者提供了直接操控网络连接和数据传输的手段。从即时通讯应用到网络游戏服务器&#xff0c;从文件传输工…

智能EDA小白从0开始 —— DAY24 Pulsic

Pulsic公司简介及其革命性EDA工具Animate Preview深度解析 一、公司概览与背景 Pulsic&#xff0c;一家深耕于电子设计自动化&#xff08;EDA&#xff09;领域的精密设计自动化公司&#xff0c;自2001年1月在英国布里斯托尔成立以来&#xff0c;便致力于解决先进节点设计所面…

一些简单的汇编指令

硬件架构和汇编指令 一、硬件架构 ARM芯片属于精简指令集计算机(RISC:Reduced Instruction Set Computing)&#xff0c; 它所用的指令比较简单&#xff0c;有如下特点: ① 对内存只有读、写指令 ② 对于数据的运算是在CPU内部实现 ③ 使用RISC指令的CPU复杂度小一点&#xff0…

中国科学院大学与美团发布首个交互式驾驶世界模型数据集DrivingDojo:推进交互式与知识丰富的驾驶世界模型

中国科学院大学与美团发布首个交互式驾驶世界模型数据集DrivingDojo&#xff1a;推进交互式与知识丰富的驾驶世界模型 Abstract 驾驶世界模型因其对复杂物理动态的建模能力而受到越来越多的关注。然而&#xff0c;由于现有驾驶数据集中的视频多样性有限&#xff0c;其卓越的建…

简述RESTFul风格的API接口

目录 传统的风格API REST风格 谓词规范 URL命令规范 避免多级URL 幂等 CURD的接口设计 REST响应 响应成功返回的状态码 重定向 错误代码 客户端 服务器 RESTful的返回格式 返回格式 从上一篇文章我们已经初步知道了怎么在VS中创建一个webapi项目。这篇文章来探讨一…

外包干了2个月,技术明显退步

回望过去&#xff0c;我是一名普通的本科生&#xff0c;于2019年通过校招有幸加入了南京某知名软件公司。那时的我&#xff0c;满怀着对未来的憧憬和热情&#xff0c;投入到了功能测试的岗位中。日复一日&#xff0c;年复一年&#xff0c;转眼间&#xff0c;我已经在这个岗位上…

Git协作场景

1、日常需求开发 在日常开发中&#xff0c;研发人员通常需要从 develop 分支创建 feature 分支进行功能开发&#xff0c;并在开发完成后将其合并回 develop。常规的操作流程如下&#xff1a; 创建 feature 分支&#xff1a; 研发人员从 develop 分支创建一个新的 feature 分支…