20190322腾讯面试总结
-
B+树
B+树的节点按页存储,每一个页包含一个键、多个数据和指针,当从磁盘换入内存的时候只需要一次I/O,然后根据查找数据的范围确定下一个需要访问的指针,如此类推,直到找到最终的目标数据,三层的B+书可以表示上百万的数据,查找高度最多只需要三次I/O。
image.png -
time_wait状态存在的目的
1、可靠地实现了TCP全双工连接的终止
2、允许老的重复分节在网络中的消逝(为什么需要2MSL)
当数据包在由于路由线路中断或者路由器崩溃时需要重新寻找一条新的线路,这个
过程需要几秒甚至更长,发送端的tcp超时重传,但不久后网络恢复,这个数据包又
被送到目的地,如果此时同ip同端口已经启动的新的连接,那么旧的报文段可能会
被看成是新连接的报文段,如果旧的报文段中数据的任何序列号恰恰在新连接的当
前接收窗口中,数据就会被重新接收,对连接造成破坏。为了避免这种情况,TCP
不允许处于TIME_WAIT状态的连接启动一个新的连接,因为TIME_WAIT状态持续
2MSL,就可以保证当再次成功建立一个TCP连接的时,来自之前连接的旧的报文段
已经在网络中消逝,不会再出现在新的连接中。 -
new和malloc的区别
1、new是操作符,malloc是库函数
2、new可以重载(底层不只使用mallloc,可以不在堆中分配内存),malloc不能
3、new分配内存失败 报错,malloc返回null
4、new会调用构造函数,malloc不会
5、new分配自由内存区(默认情况下是堆),malloc只分配堆空间 -
深拷贝和浅拷贝的区别,删除一个浅拷贝的时候要注意什么
浅拷贝只是对指针的拷贝,拷贝后两个指针指向同一个内存空间,深拷贝不但对指
针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同
地址的指针。
浅拷贝特别需要注意的就是析构时的问题, 当多个指针指向同一份内存时,删除这
些指针将导致多次释放同一内存而出错。 -
析构函数为什么要使用虚函数
基类指针可以指向派生类的对象(多态性),如果删除该指针delete []p;就会调用该
指针指向的派生类析构函数,而派生类的析构函数又自动调用基类的析构函数,这样整
个派生类的对象完全被释放。如果析构函数不被声明成虚函数,则编译器实施静态绑
定,在删除基类指针时,只会调用基类的析构函数而不调用派生类析构函数,这样就会
造成派生类对象析构不完全。所以,将析构函数声明为虚函数是十分必要的。 -
vector、list、map 查询插入和更新的时间复杂度
-
如何解决大量出现time_wait,close_wait出现的情况
https://www.cnblogs.com/sunxucool/p/3449068.html -
结构体和类的区别
1、struct 的成员默认访问类型是public的,而class是private的
2、struct 没有默认构造析构函数,class有