第3章 高频C++/C#面试题与回答框架:内存管理、多态、虚函数、垃圾回收、引用与指针
本章覆盖游戏客户端面试中 C++/C# 的六大核心考点:内存管理、多态、虚函数、垃圾回收、引用与指针。每个考点都配有「考察意图 → 回答路径 → 示例话术 → 追问防御」的闭环框架,帮助你在 3 分钟内给出面试官想要的深度回答。
知识结构概览
| 主题 | 核心机制 | 高频工具 / 概念 | 面试常见切入角度 |
|---|---|---|---|
| 内存管理 | RAII、智能指针 | unique_ptr / shared_ptr / weak_ptr | 内存泄漏防范、循环引用 |
| 多态与虚函数 | vtable 动态绑定 | 虚函数表、vptr、抽象类 | 多态实现原理、构造调用 |
| C# 垃圾回收 | 分代回收、标记-压缩 | GC 代际、对象池、析构函数 | GC 对帧率的影响、优化手段 |
| 引用与指针 | 值类型 vs 引用类型 | C++ 引用、C# ref / out | 对比选型、安全性、性能差异 |
▲ 回答框架图:从「内存管理」出发,按语言路线组织回答要点
📌 问答卡片 1 · C++ 内存管理
面试问题:请谈谈 C++ 中的内存管理方式,如何有效防止内存泄漏?
面试官考察点:
- 是否理解栈与堆的本质区别
- 是否掌握 RAII 资源管理思想
- 能否熟练运用智能指针并说明其适用场景
- 对循环引用等隐蔽泄漏是否有防范意识
回答框架:
- 区分栈与堆:栈上对象自动管理,堆上对象需手动释放
- 引入 RAII:资源获取即初始化,将资源生命周期绑定到栈对象
- 智能指针选型:unique_ptr 独占所有权,shared_ptr 共享引用,weak_ptr 打破循环
- 避免裸指针:生产代码中杜绝裸 new/delete,统一使用智能指针
简短示例回答:
C++ 内存管理核心是栈与堆的区分:栈上对象自动析构,堆上对象需手动释放。我严格遵循 RAII 原则,将堆资源封装在栈对象中。对于动态对象,优先使用 unique_ptr 实现独占所有权;共享场景用 shared_ptr,并搭配 weak_ptr 打破循环引用。杜绝裸 new/delete,从架构层面消除内存泄漏。
可能追问:
shared_ptr的引用计数如何保证线程安全?- C++ 中引用和指针在语法和安全性上有哪些本质区别?
- 自定义删除器在什么场景下必须使用?
⚠️ 避坑提醒:不要过度使用 shared_ptr,避免循环引用导致内存泄漏。另外,shared_ptr 的引用计数操作是原子性的,但对象本身的线程安全仍需自行保证。