1、介绍一下最近一年的项目
答:巴拉巴拉
2、说下这个项目你解决过什么问题?
答:巴拉巴拉,聊到内存泄露
3、你觉得你遇到的内存泄露都有哪几种?
答:有继承关系的类父类析构没有声明成虚函数的、malloc、new指针未释放的、vector里面指针未释放的,还一个内存占用问题就是vector元素只进行了pop,没有释放内部数组内存,导致容器占用的内存逐渐变大。
注:夜里忽然惊醒,想到当时紧张忘说了文件描述符未释放的问题。比如open的文件未关闭,连接的socket不再使用未断开。
4、那你是怎么释放vector里面的数组内存的?
答:vector str, str.swap(vector())
插曲:面试官发了个阿里的链接,在线刷题,伪代码即可。
1、设计一个方法求二叉树的高度
写出来了。
2、设计一个方法对一个有序的单向链表去重
第一次没看到有序用的set,面试官指出来了让我修改。去掉set改判断值就可以了。第二次提醒跳过的节点为什么没有释放,加了delete。
5、介绍下虚函数
答:是实现多态的核心,父类声明虚函数,子类重写。虚函数原理是一个类的实例的首地存放的是虚函数表指针地址,使用该地址可以访问虚函数表,起初虚函数表内都是父类虚函数的地址,当被实例化为子类时,会用子类虚函数的地址替换虚函数表中的对应函数地址,实现函数覆盖。
6、介绍下进程和线程
答:进程是系统资源分配的基本单位,线程是CPU调度的基本单位。
切换:
进程切换:
1、切换页表目录(虚拟内存到物理内存的映射)
2、切换内核堆栈(整个内存空间)
3、上下文切换(核心消耗是需要把进程数据放入到寄存器)
4、刷新TLB(就是padg cache,存放磁盘数据索引,加快磁盘文件访问效率)
线程切换:
1、切换栈(隶属于同一进程相同的内存空间,只切换栈)
2、上下文切换(没有进程数据的换出换入,仅切换少量寄存器)
数据同步:
进程:
通信:普通管道、有名管道、消息队列、共享内存、内存文件映射、socket
同步:信号、信号量
线程:
通信:共享变量地址即可
同步:各种锁,互斥锁、自旋锁、读写锁、条件变量
7、fork介绍一下,返回值都代表什么意思
答:返回0是子进程、返回正数为父进程,正数是子进程PID,返回-1执行失败
8、智能指针说一下
答:使用计数记录引用次数,计数为0时析构才释放内存
9、linux中so和a的类不需要导出、windos的dll和lib类需要导出才能使用这是为什么?
答:这个不知道,面试官说不要紧
10、用过什么开源库
答:pcap网络收发包和一个开源的http协议文件,boost没用过。面试官回复不要紧。
11、了解数据库吗?
答:自学过mysql和redis,原理和指令都学过,但是指令记不太清楚了。面试官回复可以没再细问。
12、了解分布式吗?
答:不了解。面试官回复不要紧,这个可以学习。