标头中的 const inline std::map 会导致退出时堆损坏

Vic*_*tor 5 c++ inline constants stdmap c++17

我希望std::map标头中的 const 作为将在其他 cpp-s 中使用的全局常量。所以我将其声明为:

// header.h
const inline std::map<int, int> GlobalMap = { {1, 2}, {3, 4} };
Run Code Online (Sandbox Code Playgroud)

但是,如果我在多个 cpp-s 中包含此标头,则在退出时会发生堆损坏,因为为同一内存地址运行多个析构函数。

我一直认为内联 const 是全局非文字常量的灵丹妙药。我已将 global std::string-s 声明为const内联,并且效果很好。

所以我的问题是:

  1. 为什么要发生这种情况?难道const内联不是很容易出错吗?
  2. 如何const std::map在 C++17 中正确声明全局?我怎样才能确保只创建一个全局对象?

编辑:我可以在 Visual Studio 2017 中的以下项目中重现它(/std:c++17,调试 x86)

文件_1.h:

#pragma once
#include <map>

const inline std::map<int, double> GlobalMap = {{1, 1.5}, {2, 2.5}, {3, 3.5}};

void f1();
Run Code Online (Sandbox Code Playgroud)

文件_1.cpp:

#include "file_1.h"

void f1()
{
    (void)GlobalMap;
}
Run Code Online (Sandbox Code Playgroud)

主要.cpp:

#include "file_1.h"

int main()
{
    f1();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*ail 2

这看起来像 Visual Studio 错误:https://developercommunity.visualstudio.com/t/static-inline-variable-gets-destroyed-multiple-tim/297876

在发布时,该错误的状态为“已关闭 - 较低优先级”,即尚未修复。

来自微软代表的评论

如果您在我们的最新版本中仍然遇到此问题,请将其作为新问题报告。

所以我建议通过重现案例提交一个新问题。