全局静态生存期?他们会让你的程序崩溃吗?
Global statics lifetime? Can they crash your program?
假设您定义了几个文件级静态对象:
//foo.cpp
static std::map<std::string, std::string> bar;
static MyCustomCompicatedClass baz;
C++标准是否规定了它们的生命周期?他们的析构函数究竟什么时候会被调用?
我听说全局静态从来都不是一个好主意,如果在 vcruntime 从内存中加载出来后调用它们的析构函数(无论如何,在 Windows 上(,可能会使您的程序崩溃。这是真的吗?有人可以分享详细信息吗?其他平台呢?
在一个编译单元中,它们以与构造顺序相反的顺序销毁。
跨单元(即在单独的 cpp 文件中(,它们的构造顺序(以及它们的销毁顺序(是不确定的("静态初始化顺序惨败"(,并且出现了各种问题。
全局变量分两次初始化。首先初始化可以const
初始化的那些。接下来初始化需要动态初始化的那些。
未指定初始化两个不同编译单元中的全局变量的顺序。但是,给定编译单元中的变量是确定性的。它们按照它们在文件中出现的顺序进行初始化。
在输入main
之前初始化所有全局变量。
该标准保证这些变量的析构函数将以与初始化相反的顺序调用。
如果程序有错误,程序可能会在析构函数中崩溃。如果它们是干净的,则程序不应崩溃。
相关文章:
- 程序崩溃并显示"std::out_of_range"错误
- 试图创建流或fopen时程序崩溃
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 如何找出应用程序崩溃的原因 - Win 10 LTSB
- 操纵安卓相机的深度图导致应用程序崩溃
- 为什么当我尝试搜索双链表中第一个数据条目之外的数据时,程序崩溃了?
- DLL Made with CMake 使程序崩溃
- 程序崩溃使用boost::asio
- 调用 free() 有时会导致程序崩溃
- 邮件加密程序崩溃
- 调用 java 的回调() 时应用程序崩溃.由于 detatchThread 而获得运行时错误
- 比较迭代器会使程序崩溃,而不会在自定义气泡排序实现中出现错误
- For 循环在尝试读取数组 c++ 时程序崩溃
- 即使有 0 个错误,Getter 似乎也会使程序崩溃
- Windows桌面程序保存您的计算机会话 - 基于程序崩溃时的恢复会话
- 无法访问的代码如何导致我的程序崩溃?
- 矢量迭代器在尝试调用函数时使我的程序崩溃
- QCompleter set模型使应用程序崩溃
- 使用唯一指针调用函数会使我的程序崩溃
- 删除SDL_PollEvent时程序崩溃