内联映射初始化的动态atexit析构函数崩溃
dynamic atexit destructor crash for inline map initialization
我有一个通用的头文件,它将用于我的静态lib、dll和exe。静态库链接到我的exe和dll。Dll将由exe加载。对于其中一个要求,我想使用一个全局映射,它将在dll和exe中使用,但我不能,因为头中不允许初始化(得到多个重新定义错误(。所以我使用了C++17的内联特性。
在我的头文件中,我声明了这样一个映射。
enum class eCategory
{
eInvalid = 0,
eCategory1 = 1,
eCategory2,
eCategory3,
eCategory4
};
inline std::map<eCategory, std::string> testCategoryMap{
{ eCategory::eCategory1, "Category1" },
{ eCategory::eCategory2, "Category2"},
{ eCategory::eCategory3, "Category3"},
{ eCategory::eCategory4, "Category4" },
{ eCategory::eInvalid, "Invalid" }
};
当我试图执行我的exe时,我在出口析构函数崩溃时得到了动态。此链接https://stackoverflow.com/questions/1952467/what-does-dynamic-in-dynamic-atexit-destructor-mean建议我使用atexit((,但不确定如何实现。
有人能帮我解决这个问题吗。
注意:我刚刚用static替换了inline,并将其添加到命名空间中,它运行良好。使用静电有什么害处吗?
但我刚刚用static替换了inline,它就开始工作了。
使用static
会绕过应用程序范围的一定义规则(ODR(。ODR变成了特定于编译单元的。这意味着您将在应用程序中分布多个testCategoryMap
实例,它们都不会相互干扰。
仅使用inline
关键字意味着应用程序范围的One Definition Rule确实适用。让多个编译单元包含相同的头文件是ODR冲突:不需要诊断。当一个应用程序有多个包含该标头的编译单元时,无论该应用程序是否构建,都是一个未定义的行为抛出;如果它确实构建了,无论应用程序是否在某个时刻崩溃,都是未定义的行为抛出。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 什么时候调用析构函数
- 优先顺序:智能指针和类析构函数
- C++-明确何时以及如何调用析构函数
- 使用基类指针创建对象时,缺少派生类析构函数
- 在c++中使用向量时,如何调用构造函数和析构函数
- 重载运算符new[]的行为取决于析构函数
- 我需要知道编译器如何在cpp中使用析构函数
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 析构函数调用
- 通过引用传递-为什么要调用这个析构函数
- 对具有动态分配的内存和析构函数的类对象的引用
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- C++成员的析构函数顺序与shared_ptr
- C++ 防止在映射中放置()时调用析构函数
- 在这种情况下显式调用时,std::cout 如何更改析构函数的行为?
- 调用析构函数以释放动态分配的内存
- 当我们使用 atexit() 时,不会为本地对象调用析构函数