同为股份 C++ 开发面试
- 轮次
- 技术面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 请做一下自我介绍。
- RAG 知识库项目用来解决什么问题?
- Linux 进程已经 free/delete 了大量对象,为什么 RSS 可能不下降?
- 互斥锁、读写锁、自旋锁有什么区别和使用场景?
- C++ 对象在内存里的布局是什么?为什么 sizeof 空类不是 0?
- RSS 和 VSS 分别是什么意思?
- Linux 缺页异常是什么?malloc 1GB 为什么物理内存可能几乎不增加?
- 为什么需要线程池,而不是每次直接创建线程?
- 线程池任务队列越大越安全吗?无限队列有什么风险?
- static 关键字有什么作用?
- 两个 cpp 文件中的全局静态对象互相依赖,为什么可能偶发崩溃?
- 虚拟内存和物理内存有什么区别?
《参考解析》
RSS 不下降不等于内存泄漏。free/delete 通常只把内存还给用户态分配器,glibc malloc、jemalloc、tcmalloc 会把空闲块留在 arena、bin 或 thread cache 中,操作系统看到的仍是进程占用的页。判断时要区分真实泄漏、分配器缓存和碎片:看 heap profile 的 allocated bytes 是否持续上涨,再结合 smaps、PSS 和分配器指标。
锁的选择取决于临界区长度、读写比例和竞争程度。互斥锁适合通用临界区,读写锁适合读多写少且读临界区不极短,自旋锁适合极短且持锁线程很快能运行的情况。自旋锁下做数据库查询会白白烧 CPU。
C++ 对象布局受成员顺序、对齐和 padding 影响,空类至少占 1 字节以保证不同对象有不同地址。含虚函数的对象通常有 vptr,多继承和虚继承会更复杂。malloc 只分配虚拟地址空间,首次访问页面才触发缺页并建立物理映射,所以 malloc 1GB 后 RSS 可能几乎不变,memset 后才会明显上涨。