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

Windows下g++9.2.0中thread_local unordered_map程序崩溃求助

问题原因与解决方案

核心原因

这是MinGW-w64版本的GCC 9.x系列在Windows平台上的已知线程局部存储(TLS)析构bug。当程序主线程退出时,thread_local修饰的std::unordered_map会触发析构,但此时C++运行时的部分内部全局结构已经被提前释放,导致容器析构过程中出现非法内存访问(对应错误码0xC0000005,即你看到的退出码-1073741819)。Unix-like系统的TLS析构调度逻辑与Windows不同,因此未触发该问题。

解决方案

  1. 升级GCC版本
    该bug在GCC 10及以后的版本中已被修复,直接升级到GCC 10+即可彻底解决问题。

  2. 临时绕过方案(无法升级时)
    通过动态分配对象的方式避免thread_local容器的自动析构冲突:

    #include <iostream>
    #include <unordered_map>
    #include <memory>
    
    thread_local std::unique_ptr<std::unordered_map<uint64_t, uint64_t>> repetition_table =
        std::make_unique<std::unordered_map<uint64_t, uint64_t>>();
    
    int main(int argc, char *argv[]) {
        repetition_table->insert({0ULL, 0ULL});
        std::cout << "Hi\n";
        return 0;
    }
    

    或者手动控制对象生命周期,在程序退出前显式释放资源:

    #include <iostream>
    #include <unordered_map>
    
    thread_local std::unordered_map<uint64_t, uint64_t>* repetition_table =
        new std::unordered_map<uint64_t, uint64_t>();
    
    int main(int argc, char *argv[]) {
        repetition_table->insert({0ULL, 0ULL});
        std::cout << "Hi\n";
        // 手动释放以规避自动析构时的冲突
        delete repetition_table;
        repetition_table = nullptr;
        return 0;
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 00:13:14