Software Engineer · 语言与工程基础

C++ 段错误:从非法访问到可复现定位

解释空指针、越界、悬挂引用和栈溢出,并区分未定义行为与必然崩溃。

题目重点:解释空指针、越界、悬挂引用和栈溢出,并区分未定义行为与必然崩溃。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 讨论内存错误,不运行故意越界示例;非法操作是否形成段错误取决于环境。

解题路线

  1. 段错误常来自访问无效或受保护地址;数组越界、use-after-free、失效迭代器、错误指针运算和过深递归都可能触发。
  2. 未定义行为不保证立即崩溃,也可能静默损坏数据或被优化改变表现。不能因测试“能运行”就认为合法。
  3. 先用稳定输入与符号化堆栈缩小位置,再用 ASan/UBSan 或调试器追踪;并发竞态另用相应工具。检查对象生命周期与所有权,不只改崩溃那一行。
  4. 修复围绕 RAII、明确所有权、范围检查与安全访问接口;验证释放后调用、空容器、极端长度和并发销毁路径。

手动走一遍

vector 扩容后保存的旧元素指针失效,问题可能在随后读写才暴露;根因是生命周期变化。函数返回局部变量引用,调用方拿到悬挂引用,可能短时间看起来正常,依然错误。

规模与取舍

诊断工具有运行时/内存开销,使用测试与可控环境;定位成本随复现难度而变,不给统一百分比。

易错点与追问

容易失分的边界

  • 所有越界一定 segfault。
  • 崩溃地址就是根因。
  • 用 try/catch 捕获所有非法内存访问。

继续深挖

  • 为什么 release 构建才出现问题?
  • 如何区分资源耗尽与对象悬挂?
✓已复制微信号!