2024最新大厂C++面试真题合集,大厂面试百日冲刺 bay11

CSIG 腾讯后台

new和malloc区别

  1. "new"是C++的一个操作符,它在创建对象时会自动调用构造函数。"malloc"是C语言的函数,仅仅分配内存。
  2. "new"返回的是对象类型的指针,类型与对象的类型保持一致,无需类型转换,而"malloc"函数返回的是void类型的指针,需要转换为实际的对象类型的指针。
  3. "new"在无法分配内存时会抛出异常。"malloc"在无法分配内存时返回NULL。

操作系统分配内存的单位

操作系统分配内存的单位是页面(Page)。

操作系统分配一页,这一页一定可读可写可执行吗

不会,操作系统分配的一页内存是否可读、可写、可执行由页表中的访问权限位(RWX)决定,不是所有的页默认都具有这些权限。

访问malloc分配的指针一定偏移之后的地址会怎样

偏移后如果超过了malloc分配的内存区域,访问这个地址会是未定义行为(Undefined Behavior - UB)。

什么情况下会触发Segmentation Fault

Segmentation Fault通常会在以下情况触发:

  1. 解引用空指针。
  2. 访问野指针指向的内存。
  3. 数组或内存越界访问。
  4. 对同一个内存地址进行多次deletefree

free两次如何定位第一次free的位置

可以使用工具如Valgrind进行内存检测,或使用g++-fsanitize=address编译选项,这将在程序运行时检测到两次free并报告第一次free的位置。

析构器的调用顺序(先派生类后基类)

析构器的调用顺序是先调用派生类的析构函数,然后调用基类的析构函数。

内层函数抛异常,外层函数catch到,中间层函数的局部变量是否会调用析构器

会被调用。这是因为C++支持异常的栈展开(stack unwinding)机制,确保在抛出异常后,并在异常传播过程中,释放栈上对象的资源。

如果析构时又抛异常,catch的是哪一个,如果是新的,老异常还能捕捉到么

当析构函数在异常处理过程中又抛出异常,而在当前作用域中未对其进行捕获处理,程序将调用 std::terminate(),通常导致程序非正常退出。C++标准规定,在一个异常已经被抛出的情况下,如果在析构过程中再次抛出一个异常而未被当前析构函数内部捕获,则处理器无法同时处理两个并发的异常,因而只能调用 std::terminate()

因此,如果析构时抛出了一个新的异常,之前的异常将不再被捕捉到,因为程序在这种情况下会被终止。为了避免这种情况,你应将析构函数设计为不抛出异常,或者在其中捕获并处理任何可能抛出的异常。这通常是通过将析构函数标记为 noexcept 或在析构函数中使用 try-catch 语句来确保不退出到析构函数外部来实现的。

异常的底层原理了解么,汇编层面上的

异常处理的底层原理可以简要概括如下:

  1. 栈展开(Stack Unwinding):当异常被抛出时,程序需要找到合适的异常处理代码来处理这个异常。这个过程涉及到逆向遍历调用栈,逐层检查是否有匹配的异常处理代码(catch块)。这个遍历过程被称为栈展开。在栈展开过程中,局部对象会被析构,以保证资源得到释放。
  2. 异常表(Exception Table):编译器在编译过程中会生成异常表,这个表包含了函数中可能抛出异常的位置信息,以及对应的异常处理代码的位置信息。当异常发生时,异常处理机制会利用这个表来定位需要跳转到的catch块的位置。
  3. 跳转(Jump):一旦找到匹配的异常处理代码,程序会执行一个无条件跳转到该处理代码的开始位置。这个跳转是通过修改程序计数器(Program Counter, PC)实现的,跳过了中间的所有代码,直接到达异常处理代码的位置。
  4. 捕获异常(Catching Exceptions):异常处理代码(catch块)开始执行。在这个阶段,异常对象通常会被拷贝或引用到一个局部变量中,以便于在catch块中进行处理。
  5. 恢复正常执行流程:一旦catch块处理完毕,程序会继续执行紧接着try-catch结构之后的代码,恢复到正常的执行流程。

从汇编的角度看,异常处理涉及到调整栈指针(SP)、程序计数器(PC)以及可能的寄存器操作,以确保资源的正确释放和代码的正确跳转。

c++哪个特性类似go interface

在C++中,与Go语言的interface类似的特性是抽象基类纯虚函数

简而言之,C++的抽象基类通过声明至少一个纯虚函数来定义接口规范,从而模仿了Go的interface行为。纯虚函数在C++中使用=0语法声明,表示该函数没有实现,从而要求所有派生类必须提供该函数的具体实现。

纯虚函数能有方法体么

是的,纯虚函数在C++中可以有方法体。尽管纯虚函数被定义为没有实现的函数(通过=0语法指定),这意味着派生类必须提供该函数的实现以实现多态,但是C++允许为纯虚函数提供定义。

这样做的目的是允许基类提供一个默认的实现,派生类可以选择是否使用或覆盖它。但是,即便为纯虚函数提供了实现,拥有纯虚函数的类仍然是抽象类,不能被实例化。

收集整理了一份2024年最新C++开发学习资料,既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C++开发知识点,真正体系化!
包含大厂面经、学习笔记、实战项目、大纲路线、讲解视频 领取 君羊739729163 或者
https://docs.qq.com/doc/DR2N4d25LRG1leU9Q
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

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

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

相关文章

谷歌全力反击 OpenAI:Google I/O 2024 揭晓 AI 新篇章,一场激动人心的技术盛宴

🚀 谷歌全力反击 OpenAI:Google I/O 2024 揭晓 AI 新篇章,一场激动人心的技术盛宴! 在这个人工智能的全新时代,只有谷歌能让你眼前一亮!来自全球瞩目的 Google I/O 2024 开发者大会,谷歌用一场…

Vue 之 后台管理系统的权限路由的管理

目录 前言实现理解三者的概念以及之间的关联账号(用户)角色菜单 用户权限授权相关概念实现代码实现登录跳转路由,路由守卫中进行权限验证按钮权限封装指令:调用(其中一个页面参考) 思路,操作流程…

学习java第七十一天

DI:依赖注入 依赖注入是spring容器中创建对象时给其设置依赖对象的方式,比如给spring一个清单,清单中列出了需要创建B对象以及其他的一些对象(可能包含了B类型中需要依赖对象),此时spring在创建B对象的时候…

探索 pinia-plugin-persistedstate:为 Pinia 状态持久化助力

在使用 Pinia 进行状态管理时,我们常常希望某些重要的状态能够持久化保存,以便在应用重新启动或不同会话中保持数据的连续性。这时候,pinia-plugin-persistedstate 就派上了大用场。 首先,我们当然需要安装这个插件: …

数学:矩阵范数的定义、常见的矩阵范数

1 算子范数【从属范数】 1.1 1-算子范数【列和范数】 :即对A的每列的绝对值求和再求其中的最大值 1.2 ∞-算子范数【行和范数】即对 A 的每行的绝对值求和再求其中的最大值 1.3 2-算子范数【谱范数】 学过奇异值分解就知道谱范数是最大奇异值/ 二次型的最大特…

力扣刷题day01

前期准备: 熟练掌握一门编程语言(Java,C,python)掌握数据结构与算法算法通关手册python 重学C 编程指北C 学C之前要学C语言,重点掌握指针和内存

大数据Spark教程从入门到精通第四篇:Spark快速上手

一:Spark快速上手 1:创建Maven项目 idea安装scala_idea scala插件-CSDN博客 代表了我们安装scala的maven环境已经准备好了,代码可以正常跑了

Redis分布式锁【简单版】

文章目录 概要例子1【SETNX EXPIRE】例子2【 Redisson 】 概要 redis分布式锁六种方案 SETNX EXPIRE 方案: 描述:使用Redis的SETNX命令来尝试设置一个键值对,如果该键不存在,则设置成功并设置过期时间,实现锁的功能…

Git使用(4):分支管理

一、新建分支 首先选择Git -> Branches... 然后选择 New Branch,输入新分支名称,例如dev。 可以看到右下角显示已经切换到新建的dev分支了。 push到远程仓库,可以看到新添加的分支。 二、切换分支与合并分支 为了演示合并分支&#xff0c…

【MySQL数据库开发设计规范】之SQL使用规范

欢迎点开这篇文章,自我介绍一下哈,本人姑苏老陈 ,是一名JAVA开发老兵。 本文收录于 《MySQL数据库开发设计规范》专栏中,该专栏主要分享一些关于MySQL数据库开发设计相关的技术规范文章,定期更新,欢迎关注&…

Shell之高效文本处理命令

目录 一、排序命令—sort 基本语法 常用选项 二、去重命令—uniq 基本语法 常用选项 三、替换命令—tr 基本语法: 常用选项 四、裁剪命令—cut 基本语法: 常用选项 字符串分片 五、拆分命令—split 基本语法: 六、 文件…

NVM安装及VUE创建项目的N种方式

VUE 参考官网:https://cli.vuejs.org/zh/guide/ 目录 NVM安装 1.卸载node.js 2.安装nvm ​编辑​ 3.配置 4.使用nvm安装node.js 5.nvm常用命令 创建VUE项目 1.使用vue init 创建vue2(不推荐) 2.使用vue create创建vue2和3&#xff…

音频重采样算法

目录 算法介绍C/C代码 算法介绍 网络上的音频采样率多种多样,而播放设备通常会使用固定的采样率播放。通过重采算法,可以将任意的采样率音频都转换为你所需要的频率。 C/C代码 计算采样率比例因子 ratio // 计算采样率比例因子,这是输出采…

日期差值,

日期差值 ac代码 #include<iostream> using namespace std; int ans0; int get(int n){int mon[14]{0,31,28,31,30,31,30,31,31,30,31,30,31};ans0;int m_dayn%100;int m_month(n/100)%100;int m_year(n/10000);ansm_day;while(m_month--){//加上月数if((m_year%40&…

TINA 使用教程

常用功能 分析-电气规则检查&#xff1a;短路&#xff0c;断路等分析- 直流分析 交流分析 瞬态分析 视图-分离曲线 由于输出的容性负载导致的振荡 增加5欧电阻后OK 横扫参数 添加横扫曲线的电阻&#xff0c;选择R3&#xff1a;8K-20K PWL和WAV文件的支持 示例一&#xff1a;…

Unity学习笔记---软件介绍

软件介绍 Unity是什么 Unity是一个游戏引擎&#xff0c;也就是制作游戏的软件&#xff0c;你可以用它来制作游戏。Unity还可以用在很多其他领域&#xff0c;比如美术、建筑、汽车等等&#xff0c;但它首先是一个游戏引擎。 如果说游戏作品是一篇文章&#xff0c;编程语言就是…

单例模式介绍

【一】为什么要单例模式 单例设计模式&#xff1a; 一个类只允许创建一个对象&#xff08;或者实例&#xff09;&#xff0c;那这个类就是一个单例类&#xff0c;这种设计模式就叫作单例设计模式&#xff0c;简称单例模式。 当一个类的功能比较单一&#xff0c;只需要一个实例…

AWS简介

AWS AWS&#xff0c;全称为Amazon Web Services&#xff0c;是亚马逊公司旗下的云计算服务平台&#xff0c;自2006年起向全球用户提供广泛而深入的云计算服务。AWS是全球最全面、应用最广泛的云平台之一&#xff0c;它从全球的数据中心提供超过200项功能齐全的服务&#xff0c…

防泄密软件有哪些|2024年企业防泄密软件排行榜

在当今数字化时代&#xff0c;企业的信息安全问题愈发显得重要&#xff0c;尤其是随着网络技术的飞速发展&#xff0c;信息泄露和数据窃取的风险也日益增大。为了保障企业的核心机密和客户隐私&#xff0c;许多企业开始使用防泄密软件&#xff0c;以确保信息的安全性和完整性。…

【Linux 网络】网络基础(二)(应用层协议:HTTP、HTTPS)-- 详解

我们程序员写的一个个解决我们实际问题&#xff0c;满足我们日常需求的网络程序&#xff0c;都是在应用层。 前面写的套接字接口都是传输层经过对 UDP 和 TCP 数据发送能力的包装&#xff0c;以文件的形式呈现给我们&#xff0c;让我们可以进行应用层编程。换而言之&#xff0c…