拼多多-客户端开发(C++) - 一面 面经
1. 简单做个自我介绍,重点说说你的实习经历和负责的项目。
答案要点:
- 基本信息:学校、专业、年级
- 技术栈:熟悉的编程语言、框架、工具
- 实习经历:公司、岗位、时间、主要工作
- 项目亮点:解决的核心问题、技术难点、取得的成果
- 个人优势:学习能力、团队协作、技术热情
2. C++中指针和引用的本质区别是什么?使用场景有什么不同?
答案:
- 本质区别: 引用是别名,必须初始化且不能改变指向指针是变量,存储地址,可以为空,可以改变指向引用没有独立内存地址,指针有自己的内存空间引用不能有多级,指针可以有多级指针
- 使用场景: 引用:函数参数传递、返回值优化、操作符重载指针:动态内存分配、数组操作、链表等数据结构、需要改变指向的场景
- 安全性:引用更安全,不会为空,不会野指针
3. C++的内存布局分为哪几个区域?每个区域存储什么内容?
答案:
- 代码区(Text Segment):存储程序的机器码,只读
- 数据区(Data Segment): 已初始化数据区:全局变量、静态变量(初始化)未初始化数据区(BSS):未初始化的全局变量、静态变量
- 堆区(Heap): 动态分配的内存(new/malloc)由程序员管理,从低地址向高地址增长生命周期:手动分配和释放
- 栈区(Stack): 局部变量、函数参数、返回地址自动管理,从高地址向低地址增长生命周期:函数调用时分配,返回时释放大小有限(通常几MB)
4. 栈内存和堆内存在分配效率、生命周期、大小限制上有什么差异?
答案:
- 分配效率: 栈:非常快,只需移动栈指针堆:较慢,需要查找合适的空闲块,可能产生碎片
- 生命周期: 栈:自动管理,作用域结束自动释放堆:手动管理,需要显式释放,容易内存泄漏
- 大小限制: 栈:较小(Linux默认8MB),递归过深会栈溢出堆:较大,受系统内存限制
- 访问速度:栈更快,有CPU缓存支持
5. 如何使用RAII和智能指针来防止内存泄漏?
答案:
- RAII(Resource Acquisition Is Initialization): 资源获取即初始化,利用对象生命周期管理资源构造函数获取资源,析构函数释放资源保证异常安全,即使抛出异常也会调用析构函数
- 智能指针: unique_ptr:独占所有权,不可拷贝,移动语义shared_ptr:共享所有权,引用计数,最后一个销毁时释放weak_ptr:弱引用,不增加引用计数,解决循环引用
- 最佳实践: 优先使用unique_ptr,需要共享时用shared_ptr避免裸指针管理动态内存使用make_unique/make_shared创建
6. 什么情况下会产生野指针?如何在代码审查中识别潜在的野指针问题?
答案:
- 产生原因: 指针未初始化就使用指向的内存已被释放(悬空指针)指向栈上已销毁的局部变量数组越界导致指针指向非法区域
- 识别方法: 检查指针声明时是否初始化检查delete/free后是否置nullptr检查是否返回局部变量地址使用静态分析工具(Clang Static Analyzer、Cppcheck)使用AddressSanitizer运行时检测
- 预防措施: 指针初始化为nullptr释放后立即置nullptr使用智能指针
7. Vector和List在底层实现、内存布局、性能特性上有什么区别?
答案:
- 底层实现: vector:动态数组,连续内存list:双向链表,节点分散
- 访问性能: vector:O(1)随机访问,支持下标list:O(n)顺序访问,不支持下标
- 插入删除: vector:尾部O(1),中间O(n)需要移动元素,可能触发扩容list:任意位置O(1)(已知迭代器),不需要移动元素
- 内存开销: vector:连续内存,cache友好,扩容时可能浪费空间list:每个节点额外存储两个指针,内存碎片
- 使用场景: vector:频繁随机访问、尾部操作list:频繁中间插入删除、不需要随机访问
8. 用C++实现一个线程安全的LRU缓存,需要用到哪些数据结构和同步机制?
答案:
- 数据结构: 双向链表:维护访问顺序,头部最新,尾部最旧哈希表(unordered_map):O(1)查找key对应的链表节点组合:map<key, list<pair<key, value>>::iterator>
- 核心操作
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
C++八股文全集 文章被收录于专栏
本专栏系统梳理C++技术面试核心考点,涵盖语言基础、面向对象、内存管理、STL容器、模板编程及经典算法。从引用指针、虚函数表、智能指针等底层原理,到继承多态、运算符重载等OOP特性从const、static、inline等关键字辨析,到动态规划、KMP算法、并查集等手写实现。每个知识点以面试答题形式呈现,注重原理阐述而非冗长代码,帮助你快速构建完整知识体系,从容应对面试官提问,顺利拿下offer。
查看3道真题和解析