Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C++面试题

C++面试题

作者头像
帅地
发布于 2021-08-25 02:34:41
发布于 2021-08-25 02:34:41
1.1K00
代码可运行
举报
文章被收录于专栏:苦逼的码农苦逼的码农
运行总次数:0
代码可运行

大家好,我是帅地。

上次我更新了一整套 Java 面试题,没看过的可以我个人网站看:www.iamshuaidi.com。

也有一些人来催我更新 C++ 的面试题,刚好在正值校招,所以最近也在整理 C++ 的面试题,不过目前只整理的几十道,因为网上的面试题参差不齐,找起来不是很好找。

不过帅地会争取在这一个月内找齐的,方便大家复习,更多面试题可以看文末。

1、new/delete和malloc/free之间有什么关系?

  • 相同点:
    • 对于内部数据类型来说,没有构造与析构的过程,所以两者是等价的,都可以用于申请动态内存和释放内存;
  • 不同点:
    • new/delete可以调用对象的构造函数和析构函数,属于运算符,在编译器权限之内;
    • malloc/free仅用于内存分配和释放,属于库函数,不在编译器权限之内;
    • new是类型安全的,而malloc返回的数据类型是void *,所以要显式地进行类型转换;
    • new可以自动计算所需字节数,而malloc需要手动计算;
    • new申请内存失败时抛出bad_malloc异常,而malloc返回空指针。

2、delete与delete []有什么区别?

对于简单类型来说,使用new分配后,不管是数组数组还是非数组形式,两种方式都可以释放内存:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int *a = new int(1);
delete a;
int *b = new int(2);
delete [] b;
int *c = new int[11];
delete c;
int *d = new int[12];
delete [] d;

对于自定义类型来说,就需要对于单个对象使用delete,对于对象数组使用delete [],逐个调用数组中对象的析构函数,从而释放所有内存;

如果反过来使用,即对于单个对象使用delete [],对于对象数组使用delete,其行为是未定义的;

所以,最恰当的方式就是如果用了new,就用delete;如果用了new [],就用delete []

3、内存块太小导致mallocnew返回空指针,该怎么处理?

对于malloc来说,需要判断其是否返回空指针,如果是则马上用return语句终止该函数或者exit终止该程序;

对于new来说,默认抛出异常,所以可以使用try...catch...代码块的方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
try {
    int *ptr = new int[10000000];
} catch(bad_alloc &memExp) {
    cerr << memExp.what() << endl;
}

还可以使用set_new_handler函数的方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void no_more_memory() {
    cerr << "Unable to satisfy request for memory" << endl;
    abort();
}
int main() {
    set_new_handler(no_more_memory);
    int *ptr = new int[10000000];
}

在这种方式里,如果new不能满足内存分配请求,no_more_memory会被反复调用,所以new_handler函数必须完成以下事情:

  • 让更多内存可被使用:可以在程序一开始执行就分配一大块内存,之后当new_handler第一次被调用,就将这些内存释放还给程序使用;
  • 卸除new_handler:返回空指针,这样new就会抛出异常;
  • 调用abortexit

4、内存泄漏的场景有哪些?如何判断内存泄漏?如何定位内存泄漏?

内存泄漏的场景:

mallocfree未成对出现;new/new []delete/delete []未成对出现;

  • 在堆中创建对象分配内存,但未显式释放内存;比如,通过局部分配的内存,未在调用者函数体内释放: char* getMemory() { char *p = (char *)malloc(30); return p; } int main() { char *p = getMemory(); return 0; }

未定义拷贝构造函数或未重载赋值运算符,从而造成两次释放相同内存的做法;比如,类中包含指针成员变量,在未定义拷贝构造函数或未重载赋值运算符的情况下,编译器会调用默认的拷贝构造函数或赋值运算符,以逐个成员拷贝的方式来复制指针成员变量,使得两个对象包含指向同一内存空间的指针,那么在释放第一个对象时,析构函数释放该指针指向的内存空间,在释放第二个对象时,析构函数就会释放同一内存空间,这样的行为是错误的;

没有将基类的析构函数定义为虚函数。

判断和定位内存泄漏的方法:在Linux系统下,可以使用valgrind、mtrace等内存泄漏检测工具

5、内存的分配方式有几种?

  • 在栈上分配:在执行函数时,局部变量的内存都可以在栈上分配,函数结束时会自动释放;栈内存的分配运算内置于处理器的指令集中,效率很高,但分配的内存容量有限;
  • 从堆上分配:由new分配/delete释放的内存块,也称为动态内存分配,程序员自行申请和释放内存,使用灵活;
  • 从自由存储区分配:由malloc分配/free释放的内存块,与堆类似;
  • 从常量存储区分配:特殊的存储区,存放的是常量,不可修改;
  • 从全局/静态存储区分配:编译期间分配内存,整个程序运行期间都存在,如全局变量、静态变量等。

6、堆和栈有什么区别?

  • 分配和管理方式不同:
    • 堆是动态分配的,其空间的分配和释放都由程序员控制;
    • 栈是由编译器自动管理的,其分配方式有两种:静态分配由编译器完成,比如局部变量的分配;动态分配由alloca()函数进行分配,但是会由编译器释放;
  • 产生碎片不同:
    • 对堆来说,频繁使用new/delete或者malloc/free会造成内存空间的不连续,产生大量碎片,是程序效率降低;
    • 对栈来说,不存在碎片问题,因为栈具有先进后出的特性;
  • 生长方向不同:
    • 堆是向着内存地址增加的方向增长的,从内存的低地址向高地址方向增长;
    • 栈是向着内存地址减小的方向增长的,从内存的高地址向低地址方向增长;
  • 申请大小限制不同:
    • 栈顶和栈底是预设好的,大小固定;
    • 堆是不连续的内存区域,其大小可以灵活调整

7、静态内存分配和动态内存分配有什么区别?

  • 静态内存分配是在编译时期完成的,不占用CPU资源;动态内存分配是在运行时期完成的,分配和释放需要占用CPU资源;
  • 静态内存分配是在栈上分配的;动态内存分配是在堆上分配的;
  • 静态内存分配不需要指针或引用类型的支持;动态内存分配需要;
  • 静态内存分配是按计划分配的,在编译前确定内存块的大小;动态内存分配是按需要分配的;
  • 静态内存分配是把内存的控制权交给了编译器;动态内存分配是把内存的控制权给了程序员;
  • 静态内存分配的运行效率比动态内存分配高,动态内存分配不当可能造成内存泄漏。

8、如何构造一个类,使得只能在堆上或只能在栈上分配内存?

  • 只能在堆上分配内存:将析构函数声明为private
  • 只能在栈上生成对象:将newdelete重载为private

9、浅拷贝和深拷贝有什么区别?

浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享一块内存;而深拷贝会创造一个相同的对象,新对象与原对象不共享内存,修改新对象不会影响原对象。

10、字节对齐的原则是什么?

  • 从偏移为0的位置开始存储;
  • 如果没有定义#pragma pack(n)
    • sizeof的最终结果必然是结构内部最大成员的整数倍,不够补齐;
    • 结构内部各个成员的首地址必然是自身大小的整数倍;
  • 如果定义了#pragma pack(n)
    • sizeof的最终结果必然必然是min[n,结构内部最大成员]的整数倍,不够补齐;
    • 结构内部各个成员的首地址必然是min[n,自身大小]的整数倍。

由于公众号没有目录,阅读体验可能不大好,所以呢,更多面试题可以在我个人网站阅读哦。 C++面试题:https://www.iamshuaidi.com/2309.html

ps:点击阅读原文可直达,不过建议PC端阅读

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 帅地玩编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
软件工程导论例题详解(整本书)
一、什么是软件危机?它有哪些典型表现?为什么会出现软件危机? 答:软件危机是指在计算机软件开发、使用与维护过程中遇到的一系列严重问题和难题。它包括两方面:如何开发软件,已满足对软件日益增长的需求;如何维护数量不断增长的已有软件。 软件危机的典型表现: (1) 对软件开发成本和进度的估计常常很不准确。常常出现实际成本比估算成本高出一个数量级、实际进度比计划进度拖延几个月甚至几年的现象。而为了赶进度和节约成本所采取的一些权宜之计又往往损害了软件产品的质量。这些都降低了开发商的信誉,引起用户不满。 (2) 用户对已完成的软件不满意的现象时有发生。 (3) 软件产品的质量往往是靠不住的。 (4) 软件常常是不可维护的。 (5) 软件通常没有适当的文档资料。文档资料不全或不合格,必将给软件开发和维护工作带来许多难以想象的困难和难以解决的问题。 (6) 软件成本、软件维护费在计算机系统总成本中所占比例逐年上升。 (7) 开发生产率提高的速度远跟不上计算机应用普及的需求。 软件危机出现的原因: (1) 来自软件自身的特点:是逻辑部件,缺乏可见性;规模庞大、复杂,修改、维护困难。 (2) 软件开发与维护的方法不当:忽视需求分析;认为软件开发等于程序编写;轻视软件维护。 (3) 供求矛盾将是一个永恒的主题:面对日益增长的软件需求,人们显得力不从心。
Twcat_tree
2024/01/27
2.4K0
软件工程导论例题详解(整本书)
软件工程与软件测试_软件工程导论第三版课后答案
测试是为了发现程序中的错误而执行程序的过程,好的测试方案是极可能发现迄今为止尚未发现的错误的测试方案,成功的测试是发现了至今为止尚未发现的错误的测试。
全栈程序员站长
2022/09/27
5920
《软件工程导论第6版》--张海藩 牟永敏 课后答案及其详解 第6章 详细设计
1.假设只有SEQUENCE和DO_WHILE两种控制结构,怎么利用它们完成IF_THEN_ELSE操作? 答:转换如下: K = 1 DO WHILE(条件.AND. K.EQ.1 ) 程序块1 K=K+1 END DO DO WHILE ((.NOT. 条件) .AND. K.EQ.1) 程序块2 K=K+1 END DO
Twcat_tree
2022/11/30
4.5K0
《软件工程导论第6版》--张海藩 牟永敏 课后答案及其详解 第6章 详细设计
《软件工程导论第6版》--张海藩 牟永敏 课后答案及其详解 第1章 软件工程学概述
一、什么是软件危机?它有哪些典型表现?为什么会出现软件危机? 答:软件危机是指在计算机软件开发、使用与维护过程中遇到的一系列严重问题和难题。它包括两方面:如何开发软件,已满足对软件日益增长的需求;如何维护数量不断增长的已有软件。 软件危机的典型表现: (1) 对软件开发成本和进度的估计常常很不准确。常常出现实际成本比估算成本高出一个数量级、实际进度比计划进度拖延几个月甚至几年的现象。而为了赶进度和节约成本所采取的一些权宜之计又往往损害了软件产品的质量。这些都降低了开发商的信誉,引起用户不满。 (2) 用户对已完成的软件不满意的现象时有发生。 (3) 软件产品的质量往往是靠不住的。 (4) 软件常常是不可维护的。 (5) 软件通常没有适当的文档资料。文档资料不全或不合格,必将给软件开发和维护工作带来许多难以想象的困难和难以解决的问题。 (6) 软件成本、软件维护费在计算机系统总成本中所占比例逐年上升。 (7) 开发生产率提高的速度远跟不上计算机应用普及的需求。 软件危机出现的原因: (1) 来自软件自身的特点:是逻辑部件,缺乏可见性;规模庞大、复杂,修改、维护困难。 (2) 软件开发与维护的方法不当:忽视需求分析;认为软件开发等于程序编写;轻视软件维护。 (3) 供求矛盾将是一个永恒的主题:面对日益增长的软件需求,人们显得力不从心。
Twcat_tree
2022/11/30
6580
《软件工程导论第6版》--张海藩 牟永敏 课后答案及其详解 第5章 总体设计
1.为每种类型的模块耦合举一个具体例子。 耦合式对一个软件结构内不同模块之间互联程度的度量。耦合强弱取决于接口的复杂度,进入或访问某一模块的点,以及通过接口的数据。一般模块之间的可能的连接方式有七种,构成耦合的七种类型,它们的关系为:
Twcat_tree
2022/11/30
2.5K0
《软件工程导论第6版》--张海藩 牟永敏 课后答案及其详解 第5章 总体设计
《软件工程导论第6版》--张海藩 牟永敏 课后答案及其详解 第3章 需求分析
1.为什么要进行需求分析?通常对软件系统有哪些要求? 答:(1) 为了开发出真正满足用户需求的软件产品,首先必须知道用户的需求。对软件需求的深入理解是软件开发工作获得成功的前提条件,不论我们把设计和编码工作做得如何出色,不能真正满足用户需求的程序只会令用户失望,给开发者带来烦恼。 (2)确定对系统的综合要求:1、功能需求;2、性能需求;3、可靠性和可用性需求;4、出错处理需求;5、接口需求;6、约束;7、逆向需求;8、将来可以提出的要求,分析系统的数据要求。
Twcat_tree
2022/11/30
1.7K0
《软件工程导论第6版》--张海藩 牟永敏 课后答案及其详解 第3章 需求分析
《软件工程导论第6版》--张海藩 牟永敏 课后答案及其详解 第4章 形式化说明技术
1.举例对比形式化方法和欠形式化方法的优缺点。 形式化说明: 优点:(1)简洁准确的描述物理现象,对象获动作的结果。 (2)可以在不同软件工程活动之间平滑的过度。 (3)它提供了高层确认的手段。 缺点:大多形式化的规格说明主要关注系统的功能数据,而时序的问题,控制和行为等方面的需求却更难于表示。 非形式化说明: 优点:难度低 缺点:可能存在矛盾,二义性,含糊性,不完整性级抽象层次混乱等问题 以一个简单的俄罗斯方块游戏系统规格说明为例,用自然语言描述如下: 游戏的每个状态对应一个游戏界面,开始状态下,但变量cd_start=1是进入正常游戏的状态,cd_start=2时 进入读取游戏状态,cd_start=3是进入得分榜界面查看。在得分榜界面按任意键返回开始界面,在读取游戏界面,当游戏数据读取完成后进入正常游戏状态,正常游戏状态下,同时按下左键和右键进入储存游戏界面,数据储存结束后返回正常游戏状态,在正常游戏状态下,如果变量game_res=0,则游戏结束,进入游戏结束画面。可见,用自然语言书写的系统规格说明书,罗嗦繁杂,并且可能存在矛盾,二义性,含糊性,不完整性及抽象 层次混乱等问题。
Twcat_tree
2022/11/30
8190
《软件工程导论第6版》--张海藩 牟永敏 课后答案及其详解 第4章 形式化说明技术
《软件工程导论第6版》--张海藩 牟永敏 课后答案及其详解 第2章 可行性研究
文章目录 第1题 第2题 第3题 第4题 第5题 第1题 1.在软件开发的早期阶段为什么要进行可行性研究?应该从哪些方面研究目标系统的可行性? 答:(1)开发一个软件时,需要判断原定的系统模型和目标
Twcat_tree
2022/11/30
1.1K0
《软件工程导论第6版》--张海藩 牟永敏 课后答案及其详解 第2章 可行性研究
软件测试习题(附答案)
1. 在软件生命周期的哪一个阶段,软件缺陷修复费用最低                               (   A   )
红目香薰
2022/11/29
1.9K0
软件工程期末试题及答案(史上最全)
43、什么是软件复用?简述软件复用和软件共享、软件移植的差别。 答:软件复用是指在构造新的软件系统的过程中,对已存在的软件人工制品的使用技术。如果是在一个系统中多次使用一个相同的软件成分,这叫软件共享;对一个软件进行修改,使它能运行于新的软、硬件平台这称作软件移植。
全栈程序员站长
2022/09/28
3.3K0
软件工程期末试题及答案(史上最全)
C程序设计(第四版)课后习题完整版 谭浩强编著
答:程序就是一组计算机能识别和执行的指令。 程序设计是指从确定任务到得到结果,写出文档的全过程。(一般经历6个阶段:①问题分析;②设计算法;③编写程序;④对源程序进行编辑,编译和连接;⑤运行程序,分析结果;⑥编写程序文档;)
用户2417870
2019/09/16
1.5K0
软件测试全网最全复习总结-别杠,杠就是你对
v模型强调了整个软件项目开发中需要经历的若干个测试级别,每个级别都与一个开发阶段对应。但是V模型没有明确指出应该对需求、设计进行测试。
唔仄lo咚锵
2021/12/31
1.2K0
软件测试全网最全复习总结-别杠,杠就是你对
【愚公系列】软考中级-软件设计师 038-软件工程基础(系统测试)
系统测试是一种测试方法,用于确定计算机系统或软件是否满足所需的功能和需求。在系统测试中,测试人员会执行一系列测试用例和场景,以验证系统的各个部分和功能是否正常工作。系统测试通常包括功能测试、性能测试、安全测试、兼容性测试等。这种测试方法旨在发现系统错误和问题,并为解决这些问题提供反馈和改进建议。系统测试是软件开发生命周期中的一个重要步骤,可以确保系统在投入使用之前是可靠和高质量的。
愚公搬代码
2024/04/16
2320
软件测试笔记总结(探灵笔记手机版下载教程)
广义的软件测试定义:人工或自动地运行或测定某系统的过程,目的在于检验它是否满足规定的需求或弄清预期结果和实际结果间的差别
全栈程序员站长
2022/07/31
3.1K0
软件测试笔记总结(探灵笔记手机版下载教程)
软件工程黑盒白盒测试
等价类划分法是把程序的 输入域 划分为若干部分,然后从每个部分中选取少数代表性数据当作测试用例。
wsuo
2021/01/14
1.5K0
软件工程黑盒白盒测试
吕云翔 软件工程课后题答案
因为软件工程提出是为了解决软件危机所带来的各种弊端。具体的讲,软件工程的目标主要包括以下几点。
风骨散人Chiam
2021/09/06
4.8K0
第二节(C语句储存信息,表达式和运算符)
变量:是计算机内存中一个已命名的数据存储位置。在程序中使用变量名,实际上是引用储存在该位置的数据。
冷影玺
2023/10/11
6280
第二节(C语句储存信息,表达式和运算符)
软件测试技术之: 白盒测试和黑盒测试[通俗易懂]
一般地,我们将软件测试活动分为以下几类:黑盒测试、白盒测试、静态测试、动态测试、手动测试、自动测试等等。
全栈程序员站长
2022/10/02
7K0
软件测试技术之: 白盒测试和黑盒测试[通俗易懂]
c语言基础练习题详解
💞💞 1.C语言程序的基本单位是(C)。 A.程序行 B. 语句 C. 函数 D.字符 💞💞 2.已知各变量的类型说明如下:
洁洁
2023/10/10
3910
Linux基础(五)
一、shell编程基础 1、shell编程 程序=指令+数据 编程风格: 过程式:以指令为中心,数据服务于指令 对象式:以数据为中心,指令服务于数据 shell程序:提供了编程能力,解释能力 2、路径设置 export $PATH:/root export $PATH:. shell脚本到哪儿都能执行(不建议)很危险 vim .bash_profile 生效:. .bash_profile source .bash_profile 问题:当我创建一个shell文件之后,当移动着个文件后,发现他任然在找
企鹅号小编
2018/01/12
1.3K0
Linux基础(五)
推荐阅读
相关推荐
软件工程导论例题详解(整本书)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验