Ali*_*232 8 c++ global-variables
一段时间以来一直困扰着我,但我没有找到关于此事的任何好资源.我的代码中有一些全局变量.很明显,它们是按照某种顺序初始化的,但是在进行任何初始化之前保留所有这些对象所需的内存是什么?
这是我的代码中可能出错的简单示例以及如何使用答案:
我有一个map<RTTI, object*> objectPool在我的代码中保存每个类的样本,我用它来加载文件中的对象.为了创建这些示例,我使用一些全局变量来将类实例引入objectPool.但有时这些示例实例是在ObjectPool本身之前初始化的.这会产生运行时错误.
为了解决这个错误我使用了一些延迟初始化程序map<RTTI,object*>* lateInitializedObjectPool;.现在每个实例首先检查objectPool是否已初始化,如果没有则初始化它,然后将其自身引入对象池.它似乎工作正常,但我担心,即使对象池指针所需的内存在其他类开始自我介绍之前没有保留,这可能会导致访问冲突.
在命名空间范围内声明的变量(与类或函数相对)具有由可执行(或DLL)加载器分配的对象本身(sizeof(ObjectType))的空间.如果对象是使用聚合初始化的POD,那么它通常通过让链接器将这些值直接写入可执行文件并且exe的加载器简单地将所有这些值放入内存来获取其值.不使用聚合初始化的对象最初会将其值清零.
毕竟,如果这些对象中的任何一个具有构造函数,那么在 main运行之前执行这些构造函数.因此,如果这些构造函数中的任何一个动态分配内存,那就是他们这样做的时候.加载可执行文件后,但在main运行之前.