我有以下简单代码:
// test.hpp
#pragma once
#include <deque>
struct A {
static thread_local std::deque<int> g;
};
// test.cpp
#include "test.hpp"
thread_local std::deque<int> A::g = std::deque<int>();
// main.cpp
#include "test.hpp"
int main() {
A::g.emplace_back(0);
return 0;
}
当我用 Clang 编译它时,它以代码 0 结束,一切正常。但是,如果我用 GCC 编译它,它会因 SIGSEGV 而崩溃。
对 GCC STL 源代码的一些调试显示,在
emplace_back
期间,std::deque
的内部指针似乎是 NULL
,这导致尝试分配内存和放置 int
失败进入它。
我做错了什么,或者这是一个 GCC 错误?
版本:
附言用 std::vector 替换 std::deque 以某种方式解决了问题(GCC 生成代码为 0 的二进制完成)
它看起来像一个 GCC 错误。
您提供的代码似乎是正确的,并且它与 Clang 一起工作的事实表明它是特定于编译器的问题。此外,用 std::vector 替换 std::deque 修复了问题,进一步表明该问题与 std::deque 相关。
不同的编译器有不同的行为或错误并不少见,这似乎是其中一种情况。您可以考虑将错误报告给 GCC 团队,以便他们进行调查并可能修复它。
同时,如果需要使用 std::deque 和 GCC,可以尝试使用较早版本的 GCC 或切换到 Clang。