面试总结
本次面试的发现自己对基础部分的知识内部原理了解不清楚,没有进行深度的剖析。自己还需要对C++11基础知识进行深入学习,深入学习STL库方法,深入学习多线程,实战QML应用。
1.怎么进行内存泄露检查和优化?
- 堆内存的泄漏,堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完成之后必须显示释放内存。应用程序一般使用malloc、realoc、new等函数从堆中分配到一块内存块,使用完成后,程序必须负责相应的释放。在C中使用free(),C++中delete、delete[]、free()。VLD检测工具检查。
2.list和vector的区别是什么?
- List封装了链表,Vector封装了数组, list和vector得最主要的区别在于vector使用连续内存存储的,他支持[]运算符,而list是以链表形式实现的,不支持[].
QVector 是QT的一个通用容器类,它在相邻的内存位置中存储items的值,并且提供基于索引(index-based)的快速访问。
QList 是QT的一个通用容器类,它存储列表的值,并基于索引访问(index-based),同时,它插入和删除元素比较快(constant time)。
QLinkedList 是QT的一个通用容器类,它存储列表的值,并基于迭代器访问,同时,它插入和删除元素比较快(constant time)。
3.写一个链表手写倒序算法
LinkNode function(LinkNode LN){
2 LinkNode p=LN;
3 LinkNode pFormer=NULL,pNext;
4 while(p!=NULL){
5 pNext=p->next;
6 p->next=pFormer;
7 pFormer=p;
8 p=pNext;
9 }
10 return pFormer;
11 }
4.浅谈map的内部底层实现原理
Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的.
5.写观察者模式的例子,多线程
6.任务超过数量时怎么处理, 线程超过最大线程数时等待?
7.Qt model和view中index怎么使用, treeView中index怎么使用?
8.信号槽原理和机制,主要有哪几种?
- 通过MOC(meta object compiler)进行预处理
- 信号和槽关联
- 信号激活
- 槽函数的调用
- DirectConnection和QueuedConnection情况下的处理
9.C++智能指针使用, C++11和17的区别
C++11中引入了智能指针的概念,方便管理堆内存。
shared_ptr多个指针指向相同的对象。shared_ptr使用引用计数,每一个shared_ptr的拷贝都指向相同的内存。每使用他一次,内部的引用计数加1,每析构一次,内部的引用计数减1,减为0时,自动删除所指向的堆内存。shared_ptr内部的引用计数是线程安全的,但是对象的读取需要加锁。
unique具有唯一性,对指向的对象值存在唯一的unique_ptr。unique_ptr不可复制,赋值,但是move()可以转换对象的所有权,局部变量的返回值除外。与shared_ptr相比,若自定义删除器,需要在声明处指定删除器类型,而shared不需要,shared自定义删除器只需要指定删除器对象即可,在赋值时,可以随意赋值,删除器对象也会被赋值给新的对象。
10. std::move和&&右值引用
std::move函数可以以非常简单的方式将左值引用转换为右值引用。(左值、左值引用、右值、右值引用 参见:http://www.cnblogs.com/SZxiaochun/p/8017475.html)
通过std::move,可以避免不必要的拷贝操作。std::move是为性能而生。std::move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝.
11.三次握手四次挥手
- 三次握手:
(1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认
(2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack
(number )=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
(3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。 - 四次挥手:
(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
12. tcp 怎么保证数据包有序
主机每次发送数据时,TCP 就给每个数据包分配一个序列号并且在一个特定的时间内等待接收主机对分配的这个序列号进行确认。
如果发送主机在一个特定时间内没有收到接收主机的确认,则发送主机会重传此数据包。
接收主机利用序列号对接收的数据进行确认,以便检测对方发送的数据是否有丢失或者乱序等。
接收主机一旦收到已经顺序化的数据,它就将这些数据按正确的顺序重组成数据流并传递到高层进行处理。
13. tcp 和 udp 的异同
TCP 是面向流的可靠数据传输连接
UDP 是面向数据包的不可靠无连接
14. tcp 怎么保证可靠性
差错检验机制,反馈机制,重传机制,引入序号,滑动窗口协议,选择重传
15. tcp 中拥塞避免和流量控制机制
拥塞避免和流量控制这两种机制很像,但是流量控制是由接收方的接受能力也就是接收窗口所决定的,如果接收窗口够大,以动态调整发送窗口的大小调整发送速度
拥塞避免主要由网络情况所限制,网络情况良好,则加大发送速率,网络状态差(冗余 ACK 和丢包)则降低发送速率(慢启动,拥塞控制,快恢复,快重传) RENO,BBR
16. tcp 四次挥手的详细解释
tcp 四次挥手其实可以分为两个阶段
第一:
客户端至服务器的半双工连接关闭
客户端向服务器发送 FIN 信号,进入 FIN_WAIT1 的状态,等待服务器的 ACK 信号
收到服务器的 ACK 后,进入 FIN_WAIT2
第二:
服务器至客户端的半双工连接关闭
客户端收到服务器发来的 FIN 后,发送 ACK,并进入 TIME_WAIT,等待 2msl,若无异常,则客户端认为连接成功关闭
服务器收到客户端发来的 ACK 后,关闭连接
17. 四次挥手之后为什么还要等待 2msl
MSL 是报文最大生存时间
1 是因为有可能客户端发往服务器的 ACK 丢失,服务器并不知道客户端已经确认关闭,这时候客户端的关闭会导致服务器端无法正常关闭
2 是为了保证连接中的报文都已经传递。假如短时间关闭又重新实现一个 TCP 还连到了同个端口上,旧连接中尚未消失的数据就会被认为是新连接的数据。
18.Http协议中有那些请求方式?POS和Get的区别
- GET用于获取数据,POST用于修改数据
- GET使用URL或Cookie传参。而POST将数据放在BODY中。
- GET的URL会有长度上的限制,则POST的数据则可以非常大。
- POST比GET安全,因为数据在地址栏上不可见。
19.HTTP和HTTPS的区别
HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。
- 开头:HTTP 的URL 以http:// 开头,而HTTPS 的URL 以https:// 开头
- 安全:HTTP 不加密,不安全;HTTPS加密,安全。
- 端口:HTTP 标准端口是80 ,而 HTTPS 的标准端口是443
- 证书:https协议需要到ca申请证书。
20.HTTP中长连接和WebSocket的长连接的区别
一定的期限内保持链接,客户端会需要在短时间内向服务端请求大量的资源,保持TCP连接不断开。客户端与服务器通信,必须要有客户端发起然后服务器返回结果。客户端是主动的,服务器是被动的。相比HTTP长连接,WebSocket有以下特点:
- 是真正的全双工方式,建立连接后客户端与服务器端是完全平等的,可以互相主动请求。而HTTP长连接基于HTTP,是传统的客户端对服务器发起请求的模式。
- HTTP长连接中,每次数据交换除了真正的数据部分外,服务器和客户端还要大量交换HTTP
header,信息交换效率很低。Websocket协议通过第一个request建立了TCP连接之后,之后交换的数据都不需要发送 HTTP header就能交换数据,这显然和原有的HTTP协议有区别所以它需要对服务器和客户端都进行升级才能实现。