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内联,并且效果很好。
所以我的问题是:
const内联不是很容易出错吗?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)
这看起来像 Visual Studio 错误:https://developercommunity.visualstudio.com/t/static-inline-variable-gets-destroyed-multiple-tim/297876
在发布时,该错误的状态为“已关闭 - 较低优先级”,即尚未修复。
来自微软代表的评论:
如果您在我们的最新版本中仍然遇到此问题,请将其作为新问题报告。
所以我建议通过重现案例提交一个新问题。