You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

全局声明visited触发Heap use after free,局部声明正常的原因排查

问题原因分析

全局声明的vector<vector<int>> visited触发heap-use-after-free异常,核心原因是全局变量的生命周期与测试用例独立性的冲突,以及递归过程中可能的内存失效,具体分为两种常见场景:

  1. 测试用例间的状态残留与非法内存访问
    LeetCode会连续运行多个测试用例,全局变量的生命周期覆盖整个程序运行周期,不会在每个测试用例结束后自动重置。比如:

    • 第一个测试用例中,你将visited resize为对应网格的m1×n1大小,并在递归中标记访问状态;
    • 第二个测试用例运行时,若新网格尺寸m2×n2小于m1×n1,visited.resize(m2, vector<int>(n2, 0))会释放原网格中超出m2×n2的内存块;
    • 若代码中存在未完全清理的递归逻辑(或残留的访问标记),后续操作可能访问到已经被释放的旧内存区域,触发heap-use-after-free。
      而局部变量会在每个测试用例的主函数调用时重新初始化,测试用例结束后自动销毁,完全隔离了不同用例的状态,不会出现跨用例的内存非法访问。
  2. 递归过程中的vector内存重分配失效
    若你的代码中存在在递归函数pathExists内调整visited大小的逻辑(比如错误地在递归中resize),全局vector的内存重分配会导致之前的引用/迭代器失效:

    • vector扩容或缩容时,会重新分配一块新内存,复制原有数据后释放旧内存;
    • 递归栈中之前的函数调用若持有旧内存的引用(比如visited[i]的指针),后续访问时就会指向已被释放的内存,触发异常。
      局部变量的visited在主函数中一次性初始化到正确尺寸,递归过程中不会再调整大小,因此不会出现内存重分配导致的引用失效问题。

内容的提问来源于stack exchange,提问作者Someone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 08:45:49