网易电话面试经验——C 游戏服务器开发
项目
服务器架构
C++基础
1.深拷贝和浅拷贝的区别
默认拷贝构造函数实现的是浅拷贝,浅拷贝只拷贝指针本身,不拷贝指针指向的数据内容
浅拷贝一般情况下没有问题,但类成员出现指针时,会导致指针悬挂
2.C++多态如何体现
3.vector内部实现,clear会释放vector的内存吗,如何释放vector等内存
要点: size,capacity,clear()只是将size改为0
释放内存的方法:
//方法一:可以使用swap用临时变量交换释放
vector<int>().swap(xx);
//方法二:采取缩小容量至size()大小
clear();
shrink_to_fit();
4.vector和list的区别
5.如何实现vector头部插入(deque:双端队列)
6.智能指针
unique_ptr、shared_ptr
使用智能指针的原因:
1)智能指针能够帮助我们处理资源泄露问题;
2)它也能够帮我们处理空悬指针的问题;
3)它还能够帮我们处理比较隐晦的由异常造成的资源泄露。
7.析构函数能否抛出异常
析构函数不能,也不应该抛出异常
C++异常处理模型最大的特点和优势就是对C++中的面向对象提供了最强大的无缝支持。那么如果对象在运行期间出现了异常,C++异常处理模型有责任清除那些由于出现异常所导致的已经失效了的对象(也即对象超出了它原来的作用域),并释放对象原来所分配的资源, 这就是调用这些对象的析构函数来完成释放资源的任务,所以从这个意义上说,析构函数已经变成了异常处理的一部分。
1)如果析构函数抛出异常,则异常点之后的程序不会执行,如果析构函数在异常点之后执行了某些必要的动作比如释放某些资源,则这些动作不会执行,会造成诸如资源泄漏的问题。
2)通常异常发生时,c++的机制会调用已经构造对象的析构函数来释放资源,此时若析构函数本身也抛出异常,则前一个异常尚未处理,又有新的异常,会造成程序崩溃的问题。
网络
1.TCP与UDP的最大区别
2.TCP的三次握手过程
3.TCP三次握手如果服务器没有收到最后一次握手会怎么样
当Client端收到Server的SYN+ACK应答后,其状态变为ESTABLISHED,并发送ACK包给Server,如果此时ACK在网络中丢失,那么Server端该TCP连接的状态为SYN_RECV,并且依次等待3秒、6秒、12秒后重新发送SYN+ACK包,以便Client重新发送ACK包。
Server重发SYN+ACK包的次数,可以通过设置/proc/sys/net/ipv4/tcp_synack_retries修改,默认值为5。
如果重发指定次数后,仍然未收到ACK应答,那么一段时间后,Server自动关闭这个连接。
但是Client认为这个连接已经建立,如果Client端向Server写数据,Server端将以RST包响应,方能感知到Server的错误
4.四次挥手如何处理大量的TIME_WAIT
5.多路复用网络模型
算法
1.正整数n以内的最大素数
2.最长递增子序列
上一篇: 基于Maven的Hibernate入门
下一篇: 阿里提前批面试查缺补漏
推荐阅读