2026-04-04 04:34:22
CVTE校招提前批C++开发面经总结如下,结合面试问题分类解析,并补充关键知识点:
一、网络相关问题网络排查工具使用
常用工具:ping(测试连通性)、telnet(端口检测)、tcpdump/Wireshark(抓包分析)、netstat(查看网络状态)、traceroute(路由追踪)。
应用场景:若客户端与服务器未建立连接,可通过以下步骤排查:
检查物理层(网线、网卡状态)和网络配置(IP、子网掩码、网关)。
使用ping测试基础连通性,若失败则排查防火墙或路由问题。
通过telnet <IP> <port>验证端口是否开放,若失败可能是服务未启动或防火墙拦截。
使用tcpdump抓包分析三次握手是否发起或被丢弃。
TCP第一次握手未收到第二次的排查
可能原因:
服务器未收到SYN包(网络丢包、防火墙拦截)。
服务器收到SYN但未回复SYN-ACK(资源耗尽、代码逻辑错误)。
排查方法:
客户端抓包确认SYN是否发出。
服务器端检查netstat -an | grep SYN_RECV是否有半连接堆积。
调整内核参数(如tcp_synack_retries)或检查服务器负载。
浏览器输入网址的流程
DNS解析:查询域名对应的IP地址(本地缓存→本地DNS→根DNS→权威DNS)。
TCP连接:三次握手建立连接。
TLS握手(HTTPS):协商加密算法、交换密钥。
HTTP请求:发送GET/POST请求,服务器返回响应。
渲染页面:解析HTML/CSS/JS,渲染为可视化界面。
gRPC的作用
基于HTTP/2的高性能RPC框架,支持多语言(C++、Java、Go等)。
核心特性:
协议缓冲区(Protobuf)定义接口,强类型、高效序列化。
支持双向流、负载均衡、服务发现。
跨平台、跨语言通信,适用于微服务架构。
TCP粘包问题
原因:TCP是流式协议,无消息边界,多次发送的数据可能被合并接收。
解决方案:
固定长度:每条消息长度固定,不足补空格。
分隔符:使用特殊字符(如n)分隔消息。
头部标识:在消息前添加长度字段(如Protobuf的length-delimited格式)。
进程的内存空间
分段:代码段(只读)、数据段(全局/静态变量)、堆(动态内存分配)、栈(局部变量、函数调用)。
分页:虚拟内存通过页表映射到物理内存,支持按需加载和隔离。
多线程按顺序打印数据
方法:使用条件变量(std::condition_variable)或信号量控制线程执行顺序。
示例代码:
std::mutex mtx;std::condition_variable cv;int current = 0;void print(int id, int total) { std::unique_lock<std::mutex> lock(mtx); while (current != id) { cv.wait(lock); } std::cout << "Thread " << id << std::endl; current++; cv.notify_all();}死锁的实现与避免
死锁条件:互斥、占有并等待、非抢占、循环等待。
避免方法:
按固定顺序申请锁(如先锁A再锁B)。
使用std::lock同时锁定多个互斥量。
设置超时(std::timed_mutex)。
避免嵌套锁。
大端存储与小端存储
大端(Big-Endian):高位字节存储在低地址(如网络字节序)。
小端(Little-Endian):低位字节存储在低地址(如x86架构)。
检测方法:
bool isLittleEndian() { int num = 1; return *(char*)&num == 1;}防止锁忘记释放
RAII原则:使用std::lock_guard或std::unique_lock自动释放锁。
示例:
std::mutex mtx;{ std::lock_guard<std::mutex> lock(mtx); // 离开作用域自动释放 // 临界区代码}虚函数与虚表
虚表(vtable):每个包含虚函数的类有一个虚表,存储虚函数指针。
虚指针(vptr):对象实例中隐藏的指针,指向类的虚表。
调用过程:通过vptr找到虚表,根据索引调用虚函数(动态绑定)。
static的作用
类内静态成员:所有实例共享,需在类外初始化(如int MyClass::count = 0;)。
静态函数:无this指针,只能访问静态成员。
局部静态变量:函数内声明,生命周期延长至程序结束(线程安全需额外处理)。
空类默认函数
编译器自动生成:默认构造函数、默认析构函数、默认拷贝构造函数、默认赋值运算符。
若用户定义:如定义了构造函数,则不再生成默认拷贝构造函数。
设计模式图绘制
常见模式:
单例模式:类图展示私有构造函数和静态实例方法。
观察者模式:类图展示主题(Subject)和观察者(Observer)的关联。
工具:使用PlantUML或StarUML绘制UML类图。
shared_ptr原理与使用
原理:通过引用计数管理动态内存,计数为0时自动释放。
使用注意:
避免循环引用(用std::weak_ptr打破)。
优先使用std::make_shared而非直接new。
禁止混用原始指针和智能指针。
vector原理
底层实现:动态数组,连续内存存储元素。
扩容机制:当容量不足时,按1.5倍或2倍扩容(具体实现依赖标准库)。
性能:随机访问O(1),插入/删除末尾O(1),中间O(n)。
参考资源:牛客网面试经验板块、GitHub开源项目(如《C++面试题汇总》)、LeetCode刷题。