首页 > 编程语言 >C++面试笔记 - (二)

C++面试笔记 - (二)

时间:2024-05-06 19:24:33浏览次数:19  
标签:函数 静态 笔记 面试 内存 new 指针 链接 C++

1、C++从代码到可执行二进制文件的过程

C++和C语言类似,一个C++程序从源码到执行文件,有四个过程,预编译、编译、汇编、链接

预编译:这个过程主要的处理操作如下:

将所有的#define删除,并且展开所有的宏定义

处理所有的条件预编译指令,如#if、#ifdef

处理#include预编译指令,将被包含的文件插入到该预编译指令的位置。

过滤所有的注释

添加行号和文件名标识。

编译:这个过程主要的处理操作如下:

词法分析:将源代码的字符序列分割成一系列的记号。

语法分析:对记号进行语法分析,产生语法树。

语义分析:判断表达式是否有意义。

代码优化。

目标代码生成:生成汇编代码。

目标代码优化。

汇编:这个过程主要是将汇编代码转变成机器可以执行的指令。

链接:将不同的源文件产生的目标文件进行链接,从而形成一个可以执行的程序。

链接分为静态链接和动态链接。

静态链接:是在链接的时候就已经把要调用的函数或者过程链接到了生成的可执行文件中,就算你在去把静态库删除也不会影响可执行程序的执行;生成的静态链接库,Windows下以.lib为后缀,Linux下以.a为后缀。

动态链接:是在链接的时候没有把调用的函数代码链接进去,而是在执行的过程中,再去找要链接的函数,生成的可执行文件中没有函数代码,只包含函数的重定位信息,所以当你删除动态库时,可执行程序就不能运行。生成的动态链接库,Windows下以.dll为后缀,Linux下以.so为后缀。

2、说说 static****关键字的作用

\1. 定义全局静态变量和局部静态变量:初始化的静态变量会在数据段分配内存,未初始化的静态变量

会在BSS段分配内存。直到程序结束,静态变量始终会维持前值。

\2. 定义静态函数:静态函数只能在本源文件中使用;如 static void func();

\3. 定义静态变量静态变量只能在本源文件中使用

\4. 定义类中的静态成员变量:使用静态数据成员,它既可以被当成全局变量那样去存储,但又被隐藏

在类的内部。类中的static静态数据成员拥有一块单独的存储区,而不管创建了多少个该类的对

象。所有这些对象的静态数据成员都共享这一块静态存储空间。

\5. 定义类中的静态成员函数:如静态成员函数也是类的一部分,而不是对象的一部分。所有这些对象的静态数据成员都共享这一块静态存储空间。

此外:当调用一个对象的非静态成员函数时,系统会把该对象的起始地址赋给成员函数的this指针。而静态成员函数不属于任何一个对象,因此C++规定静态成员函数没有this****指针。既然它没有指向某一对象,也就无法对一个对象中的非静态成员进行访问。

3、数组和指针的区别

\1. 概念:

(1)数组:数组是用于储存多个相同类型数据的集合。 数组名是首元素的地址。

(2)指针:指针相当于一个变量,它存放的是其它变量在内存中的地址。 指针名指向了内存的首地址。

\2. 区别:

(1)赋值:同类型指针变量可以相互赋值;数组不行,只能一个一个元素的赋值或拷贝

(2)存储方式

数组:数组在内存中是连续存放的,数组的存储空间,不是在静态区就是在栈上。

指针:指针很灵活,它可以指向任意类型的数据。指针的类型说明了它所指向地址空间的内存。由于指针本身就是一个变量,再加上它所存放的也是变量,所以指针的存储空间不能确定。

(3)求****sizeof

数组所占存储空间的内存大小:sizeof(数组名)/sizeof(数据类型)在32位平台下,无论指针的类型是什么,sizeof(指针名)都是4,在64位平台下,无论指针的类型是什么,sizeof(指针名)都是8

4、说说什么是野指针,怎么产生的,如何避免

\1. 概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)

\2. 产生原因:释放内存后指针不及时置空(野指针),依然指向了该内存,那么可能出现非法访问的

错误。这些我们都要注意避免。

\3. 避免办法:

(1)初始化置NULL

(2)申请内存后判空

(3)指针释放后置NULL

(4)使用智能指针

5、说说newmalloc的区别,各自底层实现原理。

\1. new是操作符,而malloc是函数。

\2. new在调用的时候先分配内存,在调用构造函数,释放的时候调用析构函数;而malloc没有构造函数和析构函数。

\3. malloc****需要给定申请内存的大小,返回的指针需要强转;new会调用构造函数,不用指定内存的大小,返回指针不用强转。

\4. new****可以被重载;malloc不行

\5. new****分配内存更直接和安全

\6. new****发生错误抛出异常,malloc返回null

malloc****底层实现:当开辟的空间小于 128K 时,调用 brk()函数;当开辟的空间大于 128K 时,调用

mmap()。malloc采用的是内存池的管理方式,以减少内存碎片。先申请大块内存作为堆区,然后将堆区分为多个内存块。当用户申请内存时,直接从堆区分配一块合适的空闲快。采用隐式链表将所有空闲块,每一个空闲块记录了一个未分配的、连续的内存地址。new****底层实现:**关键字new在调用构造函数的时候实际上进行了如下的几个步骤:

\1. 创建一个新的对象

\2. 将构造函数的作用域赋值给这个新的对象(因此this指向了这个新的对象)

\3. 执行构造函数中的代码(为这个新对象添加属性)

\4. 返回新对象

6、说说使用指针需要注意什么?

\1. 定义指针时,先初始化为NULL。

\2. 用malloc或new申请内存之后,应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存。

\3. 不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。

\4. 避免数字或指针的下标越界,特别要当心发生“多1”或者“少1”操作

\5. 动态内存的申请与释放必须配对,防止内存泄漏

\6. 用free或delete释放了内存之后,立即将指针设置为****NULL,防止“野指针

标签:函数,静态,笔记,面试,内存,new,指针,链接,C++
From: https://www.cnblogs.com/luo-tt/p/18175687

相关文章

  • C++面试总结(一)--c与c++不同
    C++面试总结(一)--C与C++不同c++特点C++在C语言基础上引入了面对对象的机制,同时也兼容C语言。C++有三大特性(1)封装。(2)继承。(3)多态;C++语言编写出的程序结构清晰、易于扩充,程序可读性好。C++生成的代码质量高,效率高,C++更加安全,增加了const常量、引用、四类cast转换(stat......
  • c++中文编码问题
    std::string或者constchar*,本质上都是二进制,不包含编码属性,其编码信息来源于赋值语句,QString以utf16编码,默认构造或赋值的字面量假定为utf8,若是其它编码比如ansi,可以调用QString::fromLocal8bit一、字面量的编码取决于文件,即如果在c++源文件中有直接赋值1)、constchar*s="......
  • **关于域渗透学习笔记**
    1、首先判断是否在域环境还是工作组环境netconfigworkstation查看当前登陆域及域用户工作站域显示REDTEAM为域环境工作组显示为WORKGROUPnettime/domain查看域内时间用来分辨是否是域用户,不是域用户会显示拒绝访问2、信息收集ipconfig/all查看当前网卡信息system......
  • 关于聊天机器人的阅读笔记
    目录智能对话机器人的类型知识问答机器人任务型对话机器人闲聊机器人智能对话机器人的类型知识问答机器人主要应用场景包括智能客服、政务咨询、知识获取等其主要实现方式是预定义大量的问题和答案存储在知识库中,当用户发送问题时,该程序会对该问题和知识库的问题进行对比,并寻......
  • 22. 括号生成-c++
    数字n代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。示例1:输入:n=3输出:["((()))","(()())","(())()","()(())","()()()"]示例2:输入:n=1输出:["()"]classSolution{public:vector<string>generat......
  • 39. 组合总和-c++
    给你一个无重复元素的整数数组candidates和一个目标整数target,找出candidates中可以使数字和为目标数target的所有不同组合,并以列表形式返回。你可以按任意顺序返回这些组合。candidates中的同一个数字可以无限制重复被选取。如果至少一个数字的被选数量不同......
  • 10.3顺序表的初始化以及插入实战(早期学习笔记记录)
    命名规范1.下划线命名法list_insert不同的单词用下划线连接2.驼峰命名法ListInsert每个单词首字母大写一切数据结构考的都是增(插入)删查改插入思路1、判断插入位置是否合法1<=i<=lenthif(i<1||i>lenth){returnfalse;}2、判断储存空间是否已满(插入数据后......
  • 是面试官放水,还是公司实在是太缺人?这都没挂,华为原来这么容易进...
    华为是大企业,是不是很难进去啊?”“在华为做软件测试,能得到很好的发展吗?一进去就有9.5K,其实也没有想的那么难”直到现在,心情都还是无比激动!本人211非科班,之前在字节和腾讯实习过,这次其实没抱着什么特别大的希望投递,没想到华为可以再给我一次机会,还是挺开心的。本来以为有个机......
  • 设计模式笔记
    简单记一下方便需要的时候看设计模式原则总原则:开闭原则--对扩展开放,对修改关闭单一职责里氏替换--任何基类可以出现的地方,子类一定可以出现依赖倒置--依赖于抽象而不依赖于具体接口隔离--类间的依赖关系应该建立在最小的接口上最少知道--只和朋友交谈首......
  • Unity面试手册:2021最新Unity面试题汇总
    1、什么是协同程序?答:在主线程运行时同时开启另一段逻辑处理,来协助当前程序的执行。换句话说,开启协程就是开启一个可以与程序并行的逻辑。可以用来控制运动、序列以及对象的行为。2、Unity3D中的碰撞器和触发器的区别?碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性。......