题目重点:解释空指针、越界、悬挂引用和栈溢出,并区分未定义行为与必然崩溃。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 讨论内存错误,不运行故意越界示例;非法操作是否形成段错误取决于环境。
解题路线
- 段错误常来自访问无效或受保护地址;数组越界、use-after-free、失效迭代器、错误指针运算和过深递归都可能触发。
- 未定义行为不保证立即崩溃,也可能静默损坏数据或被优化改变表现。不能因测试“能运行”就认为合法。
- 先用稳定输入与符号化堆栈缩小位置,再用 ASan/UBSan 或调试器追踪;并发竞态另用相应工具。检查对象生命周期与所有权,不只改崩溃那一行。
- 修复围绕 RAII、明确所有权、范围检查与安全访问接口;验证释放后调用、空容器、极端长度和并发销毁路径。
手动走一遍
vector 扩容后保存的旧元素指针失效,问题可能在随后读写才暴露;根因是生命周期变化。函数返回局部变量引用,调用方拿到悬挂引用,可能短时间看起来正常,依然错误。
规模与取舍
诊断工具有运行时/内存开销,使用测试与可控环境;定位成本随复现难度而变,不给统一百分比。
易错点与追问
容易失分的边界
- 所有越界一定 segfault。
- 崩溃地址就是根因。
- 用 try/catch 捕获所有非法内存访问。
继续深挖
- 为什么 release 构建才出现问题?
- 如何区分资源耗尽与对象悬挂?
