c++经典面经

1.c/c++内存存储有几种
(1)栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量值等,其操作方法类似数据结构中的栈。
(2)堆区(heap):一般由程序员分配释放,与数据结构中的堆毫无关系,分配方式类似于链表。
(3)全局/静态区(static):全局变量和静态变量的存储是放在一起的,在程序编译时分配。
(4)常量存储区:存放常量字符串。
(5)程序代码区:存放函数体(类的成员函数、全局函数)的二进制代码

2.C/C++内存分配有三种方式:
(1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
(2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
(3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由程序员决定,使用非常灵活,但如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏。

3.堆和栈的区别
(1)申请方式
堆是由程序员自己申请并指明大小,栈由系统自动分配
(2)申请空间大小不同。
堆获得的空间,栈获得的空间较小。
(3)申请速度不同
栈由系统自动分配,速度较快。但程序员是无法控制的。 堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。
(4)存储内容不同
栈在函数调用时,函数调用语句的下一条可执行语句的地址第一个进栈,然后函数的各个参数进栈,静态变量不进栈。堆在头部一般用一个字节存放内存大小,堆中的具体内容人为安排。
(5)底层不同
栈是连续空间,堆是向高地址扩展的数据结构,是不连续的内存区域。
(6)分配方式不同
堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是由操作系统完成的,比如局部变量的分配。动态分配由malloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由操作系统进行释放,无需我们手工实现。

4.malloc/free与new/delete的区别与联系
它们都是动态管理内存的入口;
(1)malloc/free 是c/c++标准的库函数,而new/delete是c++的操作符;
(2)malloc/free只是动态分配内存空间/释放空间,而new/delete除了分配空间还调用构造函数和析构函数进行初始化与清理;对于非内部数据类的对象而言,光用maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数, 对象消亡之前要自动执行析构函数。由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加malloc/free。
(3)malloc只负责开辟内存,没有初始化功能,需要用户自己初始化;new不但开辟内存,还可以进行初始化,malloc开辟的内存永远是通过free来释放的;而new单个元素内存,用的是delete,如果new[]数组,用的是delete[]来释放内存的。

5.&符号判断,&&以及||
若 x=2,y=3则 x&y 的结果是
x = 0010
y = 0011
x & y = 0010 = 2(都为1则是1,否则为0)

&&逻辑与 ||逻辑或

6.static关键子作用
1、修饰函数bai的局部变量:
特点:有默认值0,只执行一次,运行一开始就开辟了内存,内存放在全局
2、修饰全局函数和全局变量:
特点:只能在本源文件使用
3、修饰类里面的成员变量:
特点:不依赖于类对象的存在而存在(可直接调用,要进行外置声明)
4、修饰类的成员函数:
特点:f():括号里无this指针,只能调用他的本类静态函数和他的静态变量,即是用static修饰过的不依赖于类对象的存在而存在(可不进行外置声明,直接调用)

7.1、TCP与UDP区别总结:
1、 TCP面向连接 (如打电话要先拨号建立连接); UDP是无连接 的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付

Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。

3、UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。

4.每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信

5、TCP对系统资源要求较多,UDP对系统资源要求较少。

8.在浏览器中输入一个网址,全部的运行过程.
1.解析DNS,获取域名对应的IP。
2.得到对应的IP和端口号后,调用SOCKET函数,请求一个TCP流套接字,在传输层建立TCP连接,同时在物理传输bit,
3.服务器通过物理层、数据链接层、网络层、传输层、应用层,发送相应报文。
4.关闭TCP连接,四次挥手。
5.客户端解析HTTP相应报文,浏览器开始显示HTML.

你可能感兴趣的:(c++,malloc)