大华C++ 二面总结
1. 介绍一下你在一面提到的XX项目,重点说说架构设计
答案要点:
- 整体架构:采用分层架构(接口层、业务层、数据层),模块间通过接口解耦
- 技术选型:说明为什么选择某个框架/库,考虑了哪些因素(性能、可维护性、团队熟悉度)
- 难点突破:如何解决高并发、数据一致性、性能瓶颈等关键问题
- 优化迭代:项目上线后做了哪些优化,效果如何(用数据说话)
2. 如果让你设计一个线程池,你会怎么实现?
答案要点:
- 核心组件:任务队列(存储待执行任务)、工作线程数组、同步机制(mutex+condition_variable)
- 任务提交:通过模板函数接收任意可调用对象,返回future获取结果
- 线程管理:固定线程数或动态调整,线程从队列取任务执行,空闲时阻塞等待
- 优雅关闭:设置停止标志,等待所有任务完成后join所有线程
3. 说说TCP和UDP的区别,什么场景下用UDP?
答案要点:
- 连接性:TCP面向连接(三次握手),UDP无连接,开销更小
- 可靠性:TCP保证数据顺序和完整性(重传、确认),UDP不保证,可能丢包乱序
- 性能:UDP延迟低、吞吐量高,适合实时性要求高的场景
- 应用场景:UDP用于视频直播、在线游戏、DNS查询、IoT设备通信等
4. 解释一下TCP的拥塞控制机制
答案要点:
- 慢启动:连接建立初期,拥塞窗口指数增长,快速探测网络容量
- 拥塞避免:达到阈值后线性增长,避免网络过载
- 快速重传:收到3个重复ACK立即重传,不等超时
- 快速恢复:重传后将阈值设为当前窗口一半,进入拥塞避免阶段
5. 内存泄漏如何排查?有哪些工具和方法?
答案要点:
- Valgrind工具:使用memcheck检测内存泄漏、越界访问、未初始化读取等问题
- AddressSanitizer:编译时加-fsanitize=address,运行时检测内存错误,性能损耗小
- 代码审查:检查new/delete、malloc/free配对,智能指针使用是否正确
- 日志分析:记录内存分配释放,分析内存增长趋势,定位泄漏点
6. 什么是RAII?它解决了什么问题?
答案要点:
- 资源获取即初始化:在构造函数中获取资源,析构函数中释放资源,利用对象生命周期管理资源
- 异常安全:即使发生异常,栈展开时也会调用析构函数,保证资源释放
- 典型应用:智能指针、lock_guard、unique_lock、文件句柄封装
- 优势:避免手动管理资源,减少内存泄漏和资源泄漏风险
7. 红黑树和AVL树的区别?为什么STL map用红黑树?
答案要点:
- 平衡性:AVL树严格平衡(左右子树高度差≤1),红黑树弱平衡(最长路径≤2倍最短路径)
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
C++八股文全集 文章被收录于专栏
本专栏系统梳理C++技术面试核心考点,涵盖语言基础、面向对象、内存管理、STL容器、模板编程及经典算法。从引用指针、虚函数表、智能指针等底层原理,到继承多态、运算符重载等OOP特性从const、static、inline等关键字辨析,到动态规划、KMP算法、并查集等手写实现。每个知识点以面试答题形式呈现,注重原理阐述而非冗长代码,帮助你快速构建完整知识体系,从容应对面试官提问,顺利拿下offer。
查看13道真题和解析