c++ - 静态对象和全局对象的销毁顺序是什么?
问题描述
如果在一个程序中我创建了一个 meyer 的单例和一个在其构造函数和析构函数中都使用这个 meyer 的单例的对象,那么只要使用 meyer 的单例的对象在单例本身之前被销毁(就像它在函数中时一样),一切都会好起来的范围)。
现在,如果我将同一个对象设为全局,我会看到段错误。原因是单例在全局对象之前被销毁。
这是编译器定义的行为还是标准定义的行为?我们有什么办法可以修改这种行为?
任何指针将不胜感激。
解决方案
静态对象和全局对象的销毁顺序是什么?
具有静态存储持续时间的对象的销毁顺序与它们的初始化顺序相反。
这是编译器定义的行为还是标准定义的行为?
破坏的相反顺序是标准的。
非局部静态对象的初始化顺序与单个翻译单元内的声明顺序相同。未指定跨翻译单元的顺序。本地静态对象在执行第一次通过它们的声明时被初始化。
我们有什么办法可以修改这种行为?
您可以通过重新排序它们的声明来影响翻译单元中非本地静态对象的初始化顺序。您可以通过提前或稍后调用该函数来影响本地静态对象的初始化顺序。改变初始化的顺序会间接影响破坏的顺序。
您不能影响翻译单元之间具有静态存储持续时间的非本地对象的初始化顺序,并且您不能依赖该顺序。
推荐阅读
- indexing - (Cosmos DB) 复合索引中的系统函数是范围过滤器吗?
- angular - 那里有在 Angular 较新版本上添加交互式 D3 js v6 图表的任何实用指南
- sql - ORDER BY 的意外结果
- redis - Redis 集群裂脑场景
- laravel - Laravel eloquent 无法输入字段链接具有某个表的外键的数据
- ios - UIBezierPath 变色自定义
- influxdb - InfluxDB Flux 当前值减去 90 天前的值
- c++ - 当在另一个线程上完成工作时,有没有办法保护智能指针在一个线程上被释放?
- c# - Microsoft Workflow Foundation 在 Toolbox 中添加内部 Nuget 包的自定义 Activity 库
- sharepoint-list - 无法使用 Shareplum 从超过 5000 条记录的共享点列表中获取或删除数据