为什么 GCC 编译的代码在修改 thread_local std::deque 时失败?

问题描述 投票:0回答:1

我有以下简单代码:

// 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 错误?

版本:

  • Clang(生成可运行的二进制文件):Homebrew clang 版本 16.0.2
  • GCC(产生崩溃的二进制文件):g++-13(Homebrew GCC 13.1.0)13.1.0
  • 操作系统:macOS Monterey 12.5.1

附言用 std::vector 替换 std::deque 以某种方式解决了问题(GCC 生成代码为 0 的二进制完成)

c++ gcc segmentation-fault deque thread-local
1个回答
0
投票

它看起来像一个 GCC 错误。

您提供的代码似乎是正确的,并且它与 Clang 一起工作的事实表明它是特定于编译器的问题。此外,用 std::vector 替换 std::deque 修复了问题,进一步表明该问题与 std::deque 相关。

不同的编译器有不同的行为或错误并不少见,这似乎是其中一种情况。您可以考虑将错误报告给 GCC 团队,以便他们进行调查并可能修复它。

同时,如果需要使用 std::deque 和 GCC,可以尝试使用较早版本的 GCC 或切换到 Clang。

© www.soinside.com 2019 - 2024. All rights reserved.