C++面试100问!(三)

news2024/11/15 17:31:21

前言

        本次专题旨在回顾C++的一些基础,方便实时总结。

C++源文件从文本到可执行文件经历的过程?

         预处理阶段:对源代码文件中文件包含关系(头文件)、预编译语句(宏定义)进行分析和替换,生成预编译文件。

        编译阶段:将经过预处理后的预编译文件转换成特定汇编代码,生成汇编文件

        汇编阶段:将编译阶段生成的汇编文件转化成机器码,生成可重定位目标文件

        链接阶段:将多个目标文件及所需要的库连接成最终的可执行目标文件

include头文件的顺序以及双引号””和尖括号<>的区别?

        对于include的头文件来说,如果在文件a.h中声明一个在文件b.h中定义的变量,而不引用b.h。那么要在a.c文件中引用b.h文件,并且要先引用b.h,后引用a.h,否则汇报变量类型未声明错误。

        双引号和尖括号的区别:编译器预处理阶段查找头文件的路径不一样。 对于使用双引号包含的头文件,查找头文件路径的顺序为: 当前头文件目录 编译器设置的头文件路径(编译器可使用-I显式指定搜索路径) 系统变量CPLUS_INCLUDE_PATH/C_INCLUDE_PATH指定的头文件路径 对于使用尖括号包含的头文件,查找头文件的路径顺序为: 编译器设置的头文件路径(编译器可使用-I显式指定搜索路径) 系统变量CPLUS_INCLUDE_PATH/C_INCLUDE_PATH指定的头文件路径。

malloc的原理,另外brk系统调用和mmap系统调用的作用分别是什么?

        Malloc函数用于动态分配内存。为了减少内存碎片和系统调用的开销,malloc其采用内存池的方式,先申请大块内存作为堆区,然后将堆区分为多个内存块,以块作为内存管理的基本单位。当用户申请内存时,直接从堆区分配一块合适的空闲块。Malloc采用隐式链表结构将堆区分成连续的、大小不一的块,包含已分配块和未分配块;同时malloc采用显示链表结构来管理所有的空闲块,即使用一个双向链表将空闲块连接起来,每一个空闲块记录了一个连续的、未分配的地址。 当进行内存分配时,Malloc会通过隐式链表遍历所有的空闲块,选择满足要求的块进行分配;当进行内存合并时,malloc采用边界标记法,根据每个块的前后块是否已经分配来决定是否进行块合并。 Malloc在申请内存时,一般会通过brk或者mmap系统调用进行申请。其中当申请内存小于128K时,会使用系统函数brk在堆区中分配;而当申请内存大于128K时,会使用系统函数mmap在映射区分配。

C++的内存管理是怎样的?

        虚拟内存分为代码段、数据段、BSS段、堆区、文件映射区以及栈区六部分。 代码段:包括只读存储区和文本区,其中只读存储区存储字符串常量,文本区存储程序的机器代码。 数据段:存储程序中已初始化的全局变量和静态变量 bss 段:存储未初始化的全局变量和静态变量(局部+全局),以及所有被初始化为0的全局变量和静态变量。 堆区:调用new/malloc函数时在堆区动态分配内存,同时需要调用delete/free来手动释放申请的内存。 映射区:存储动态链接库以及调用mmap函数进行的文件映射 栈:使用栈空间存储函数的返回地址、参数、局部变量、返回值。

如何判断内存泄漏?

       内存泄漏通常是由于调用了malloc/new等内存申请的操作,但是缺少了对应的free/delete。为了判断内存是否泄露,我们一方面可以使用linux环境下的内存泄漏检查工具Valgrind,另一方面我们在写代码时可以添加内存申请和释放的统计功能,统计当前申请和释放的内存是否一致,以此来判断内存是否泄露。 

说一下什么时候会发生段错误?

 段错误通常发生在访问非法内存地址的时候,具体来说分为以下几种情况: 使用野指针 试图修改字符串常量的内容。

什么是memory leak,也就是内存泄漏?

        内存泄漏(memory leak)是指由于疏忽或错误造成了程序未能释放掉不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。 内存泄漏的分类: 1. 堆内存泄漏 (Heap leak)。对内存指的是程序运行中根据需要分配通过malloc,realloc new等从堆中分配的一块内存,再是完成后必须通过调用对应的 free或者delete 删掉。如果程序的设计的错误导致这部分内存没有被释放,那么此后这块内存将不会被使用,就会产生Heap Leak. 2. 系统资源泄露(Resource Leak)。主要指程序使用系统分配的资源比如 Bitmap,handle ,SOCKET等没有使用相应的函数释放掉,导致系统资源的浪费,严重可导致系统效能降低,系统运行不稳定。 3. 没有将基类的析构函数定义为虚函数。当基类指针指向子类对象时,如果基类的析构函数不是virtual,那么子类的析构函数将不会被调用,子类的资源没有正确是释放,因此造成内存泄露。

new和malloc的区别?

        1、new分配内存按照数据类型进行分配,malloc分配内存按照指定的大小分配; 2、new返回的是指定对象的指针,而malloc返回的是void*,因此malloc的返回值一般都需要进行类型转化。 3、new不仅分配一段内存,而且会调用构造函数,malloc不会。 4、new分配的内存要用delete销毁,malloc要用free来销毁;delete销毁的时候会调用对象的析构函数,而free则不会。 5、new是一个操作符可以重载,malloc是一个库函数。 6、malloc分配的内存不够的时候,可以用realloc扩容。扩容的原理?new没用这样操作。 7、new如果分配失败了会抛出bad_malloc的异常,而malloc失败了会返回NULL。 8、申请数组时: new[]一次分配所有内存,多次调用构造函数,搭配使用delete[],delete[]多次调用析构函数,销毁数组中的每个对象。而malloc则只能sizeof(int) * n。

vector和list的区别?

         1、概念: 1)Vector 连续存储的容器,动态数组,在堆上分配空间 底层实现:数组 两倍容量增长: vector 增加(插入)新元素时,如果未超过当时的容量,则还有剩余空间,那么直接添加到最后(插入指定位置),然后调整迭代器。 如果没有剩余空间了,则会重新配置原有元素个数的两倍空间,然后将原空间元素通过复制的方式初始化新空间,再向新空间增加元素,最后析构并释放原空间,之前的迭代器会失效。 性能: 访问:O(1) 插入:在最后插入(空间够):很快 在最后插入(空间不够):需要内存申请和释放,以及对之前数据进行拷贝。 在中间插入(空间够):内存拷贝 在中间插入(空间不够):需要内存申请和释放,以及对之前数据进行拷贝。 删除:在最后删除:很快 在中间删除:内存拷贝 适用场景:经常随机访问,且不经常对非尾节点进行插入删除。

        2、List 动态链表,在堆上分配空间,每插入一个元数都会分配空间,每删除一个元素都会释放空间。 底层:双向链表 性能: 访问:随机访问性能很差,只能快速访问头尾节点。 插入:很快,一般是常数开销 删除:很快,一般是常数开销 适用场景:经常插入删除大量数据

        2、区别: 1)vector底层实现是数组;list是双向 链表。 2)vector支持随机访问,list不支持。 3)vector是顺序内存,list不是。 4)vector在中间节点进行插入删除会导致内存拷贝,list不会。 5)vector一次性分配好内存,不够时才进行2倍扩容;list每次插入新节点都会进行内存申请。 6)vector随机访问性能好,插入删除性能差;list随机访问性能差,插入删除性能好。 3、应用 vector拥有一段连续的内存空间,因此支持随机访问,如果需要高效的随即访问,而不在乎插入和删除的效率,使用vector。 list拥有一段不连续的内存空间,如果需要高效的插入和删除,而不关心随机访问,则应使用list。

介绍一下udp的connect函数?

         除非套接字已连接,否则异步错误是不会反悔到UDP套接字的。我们确实可以给UDP套接字调用connect,然而这样做的结果却与TCP连接不同的是没有三路握手过程。内核只是检查是否存在立即可知的错误,记录对端的IP地址和端口号,然后立即返回调用进程。 对于已连接UDP套接字,与默认的未连接UDP套接字相比,发生了三个变化。 其实一旦UDP套接字调用了connect系统调用,那么这个UDP上的连接就变成一对一的连接,但是通过这个UDP连接传输数据的性质还是不变的,仍然是不可靠的UDP连接。一旦变成一对一的连接,在调用系统调用发送和接受数据时也就可以使用TCP那一套系统调用了。 1、我们再也不能给输出操作指定目的IP地址和端口号。也就是说,我们不使用sendto,而改用write或send。写到已连接UDP套接字上的任何内容都自动发送到由connect指定的协议地址。可以给已连接的UDP套接字调用sendto,但是不能指定目的地址。sendto的第五个参数必须为空指针,第六个参数应该为0. 2、不必使用recvfrom以获悉数据报的发送者,而改用read、recv或recvmsg。在一个已连接UDP套接字上,由内核为输入操作返回的数据报只有那些来自connect指定协议地址的数据报。这样就限制一个已连接UDP套接字能且仅能与一个对端交换数据报。 3、由已连接UDP套接字引发的异步错误会返回给它们所在的进程,而未连接的UDP套接字不接收任何异步错误。 来自任何其他IP地址或断开的数据报不投递给这个已连接套接字,因为它们要么源IP地址要么源UDP端口不与该套接字connect到的协议地址相匹配。 UDP客户进程或服务器进程只在使用自己的UDP套接字与确定的唯一对端进行通信时,才可以调用connect。调用connect的通常是UDP客户,不过有些网络应用中的UDP服务器会与单个客户长时间通信TFTP,这种情况下,客户和服务器都可能调用connect。

int sendto(int s, const void * msg, int len, unsigned int flags, const struct sockaddr * to, int tolen);

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

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

相关文章

intra-band contiguous carrier aggregation是如何判断的?

翻看38.101-1&#xff0c;在5.4A.1 Channel spacing for CA的描述中有发现具体规定。 首先 两个CC的channel spacing要为channel raster和SCS的最小公倍数的任意倍数&#xff0c;其次是否来连续要根据两个CC的channel spacing 与nominal channel spacing 做比较&#xff0c;…

睿尔曼超轻量仿人机械臂之六轴机器人运动认知与实操

机械臂运动分为关节空间运动和笛卡尔空间运动2种方式&#xff0c;2种运动方式分别对应机械臂运动学算法的正解和逆解&#xff0c;在不同的应用场景下可以使用不同的运动方式。 两种运动方式之间的不同可总结为以下几点&#xff1a; ①表示方式不同。关节空间运动发给机械臂的是…

代码学习记录16

随想录日记part16 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.03.11 主要内容&#xff1a;今天的主要内容是二叉树的第五部分&#xff0c;主要涉及最大二叉树&#xff1b;合并二叉树&#xff1b;二叉搜索树的搜索&#xff1b;验证二叉搜索树。 654.最大二叉…

《Python深度学习》阅读笔记

以下是《Python深度学习》一书中学习过程中记录的一些重要的专属名词和概念&#xff1a; 一、概念 深度学习&#xff08;Deep Learning&#xff09;&#xff1a;指使用多层神经网络进行机器学习的技术。神经网络&#xff08;Neural Network&#xff09;&#xff1a;一种模仿生…

常用SQL语句大全

目录 目录 一.SQL概念 二.数据库操作 2.0.连接数据库 2.1创建数据库 2.2使用数据库 2.3切换数据库 2.4删除数据库(慎用&#xff01;&#xff01;) 2.5查询数据库 三.表操作 3.0了解数据类型和数据约束 3.1创建表 3.2查询表 3.3修改表 3.4删除表 四.数据操作 4…

【PTA】L1-032 L1-033(c)第六天

L1-032 Left-pad 分数 20 作者 陈越 单位 浙江大学 根据新浪微博上的消息&#xff0c;有一位开发者不满NPM&#xff08;Node Package Manager&#xff09;的做法&#xff0c;收回了自己的开源代码&#xff0c;其中包括一个叫left-pad的模块&#xff0c;就是这个模块把javas…

【开源-土拨鼠充电系统】鸿蒙 HarmonyOS 4.0+微信小程序+云平台

本人自己开发的开源项目&#xff1a;土拨鼠充电系统 ✍GitHub开源项目地址&#x1f449;&#xff1a;https://github.com/cheinlu/groundhog-charging-system ✍Gitee开源项目地址&#x1f449;&#xff1a;https://gitee.com/cheinlu/groundhog-charging-system ✨踩坑不易&am…

集合系列(一) -集合框架简介

一、集合类简介 Java集合就像一种容器&#xff0c;可以把多个对象&#xff08;实际上是对象的引用&#xff0c;但习惯上都称对象&#xff09;“丢进”该容器中。从Java 5 增加了泛型以后&#xff0c;Java集合可以记住容器中对象的数据类型&#xff0c;使得编码更加简洁、健壮。…

使用点链云管家创建瑜伽约课小程序

点链云管家 点链云管家是由上海点链科技开发的门店管理系统&#xff0c;为线下门店商家提供一站式门店运营服务平台解决方案&#xff0c;适用于瑜伽健身、美业、新零售会员制电商、母婴店、宠物店、按摩养生、服装、美容、美甲、汽车服务、商超零售、餐饮、KTV娱乐、干洗等18个…

如何在Linux使用docker部署Swagger Editor并实现无公网IP远程协同编辑API文档

目录 前言 Swagger Editor本地接口文档公网远程访问 1. 部署Swagger Editor 2. Linux安装Cpolar 3. 配置Swagger Editor公网地址 4. 远程访问Swagger Editor 5. 固定Swagger Editor公网地址 结语 前言 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 …

Linux的一些常用指令

一、文件中 r w x - 的含义 r&#xff08;read&#xff09;是只读权限&#xff0c; w&#xff08;write&#xff09;是写的权限&#xff0c; x&#xff08;execute&#xff09;是可执行权限&#xff0c; -是没有任何权限。 二、一些指令 # 解压压缩包 tar [-zxvf] 压缩包名…

springboot+ssm基于vue.js的客户关系Crm管理系统

系统包含两种角色&#xff1a;管理员、用户&#xff0c;主要功能如下。 ide工具&#xff1a;IDEA 或者eclipse 编程语言: java 数据库: mysql5.7 框架&#xff1a;ssmspringboot都有 前端&#xff1a;vue.jsElementUI 详细技术&#xff1a;springbootSSMvueMYSQLMAVEN 数据库…

揭秘动态住宅代理:如何合法获取全球数据洞察

文章目录 写在前面代理网络的崛起什么是代理网络&#xff1f;动态住宅代理的革命为什么选择亮数据动态代理 如何利用采集工具获取全球亮数据写在最后 写在前面 随着互联网技术的发展&#xff0c;数据已经成为企业生存和发展的不可或缺的资源。尤其在商业世界里&#xff0c;如何…

使用 ChatGPT 写高考作文

写作文&#xff0c;很简单&#xff0c;但写一篇好的作文&#xff0c;是非常有难度的。 想要写一篇高分作文&#xff0c;需要对作文题目有正确的理解&#xff0c;需要展现独到的观点和深入的思考&#xff0c;需要具备清晰的逻辑结构&#xff0c;需要准确而得体的语言表达。 正…

租个阿里云的服务器多少钱?30元、61元、99元、165元、199元

2024年租个阿里云的服务器多少钱&#xff1f;很便宜&#xff0c;云服务器2核2G3M固定带宽99元一年、2核4G服务器30元3个月、199元一年&#xff0c;轻量应用服务器2核2G3M配置61元一年、2核4G4M带宽165元一年&#xff0c;可以在阿里云CLUB中心查看 aliyun.club 当前最新的优惠券…

Elastic Agent 的安装及使用

概述 Elastic Agent是Elastic Stack中的一个全新组件&#xff0c;旨在简化和统一监控和集成管理流程。它是一个轻量级的代理&#xff0c;可以部署到各种不同类型的主机和容器中&#xff0c;用于收集系统指标、日志和事件数据&#xff0c;并将其发送到Elasticsearch进行存储和分…

【Qt】QListView 显示富文本,设置文本内容颜色

【Qt】QListView 显示富文本&#xff0c;设置文本内容颜色 文章目录 I - 控件使用II - 显示富文本III - 注意事项 I - 控件使用 Qt 的 MVC 架构为 MV &#xff0c;Controller 部分继承到了 View 里&#xff0c;View(视图) 设置 Model(模型)&#xff0c;Model 设置数据 这里使用…

新鲜出炉!界面控件DevExpress WinForms 2024产品路线图预览(三)

DevExpress WinForm拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForm能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜任…

专业140+总400+重庆邮电大学801信号与系统考研经验重邮电子信息与通信工程,真题,大纲,参考书。

今年报考重庆邮电大学研究生&#xff0c;初试专业课801信号与系统140总分400&#xff0c;总结一下自己去年的复习经验&#xff0c;希望对大家复习有帮助。 专业课&#xff1a; 重邮专业801信号与系统难度中等&#xff0c;今年140算是正常发挥&#xff0c;没有达到Jenny老师要求…

【经验分享】Windows10无法通过SSHFS连接服务器

【经验分享】Windows10如何通过SSHFS连接服务器 前言问题分析解决方法 前言 现在很多公司出于成本考虑&#xff0c;不会为每一台电脑都提供高配置&#xff0c;所以需要通过访问云服务器来进行编译等操作。程序员如果配备的是一台windows电脑&#xff0c;那么需要访问linux服务…