C++ 中是否初始化了全局内存?
-
09-06-2019 - |
题
C++ 中是否初始化了全局内存?如果是这样,怎么办?
(二)澄清:
当程序启动时,在初始化原语之前,内存空间中的哪些内容将成为全局内存?我试图了解它是否被清零,或者例如垃圾。
情况是:可以设置单例引用 - 通过 instance()
在初始化之前调用:
MySingleton* MySingleton::_instance = NULL;
结果得到两个单例实例?
请参阅我关于单例的多个实例的 C++ 测验...
解决方案
是的,全局原语被初始化为 NULL。
例子:
int x;
int main(int argc, char**argv)
{
assert(x == 0);
int y;
//assert(y == 0); <-- wrong can't assume this.
}
你不能对堆上的类、结构、数组、内存块做出任何假设......
始终初始化所有内容是最安全的。
其他提示
从标准来看:
具有静态存储持续时间(3.7.1)的对象应在任何其他初始化发生之前进行零初始化(8.5)。零初始化和用常量表达式初始化统称为 静态初始化;所有其他初始化是 动态初始化. 。具有用常量表达式 (5.19) 初始化的静态存储持续时间的 POD [普通旧数据] 类型 (3.9) 的对象应在任何动态初始化发生之前进行初始化。在同一翻译单元的命名空间范围内定义并动态初始化的具有静态存储持续时间的对象应按照其定义在翻译单元中出现的顺序进行初始化。[注:8.5.1 描述了聚合成员初始化的顺序。6.7中描述了局部静态对象的初始含量。
所以是的,具有静态存储持续时间的全局变量将被初始化。例如,在堆上分配的全局变量当然不会自动初始化。
来自嵌入式世界...
您的代码被编译成三种类型的内存:
1.。数据:初始化内存
2.。文本:常量和代码
3..bss:未初始化的内存(如果未显式初始化,则在 C++ 中初始化为 0)
如果初始化,全局变量会进入.data。如果不是,它们将被放置在 .bss 中并在主代码中清零。
至少在 VC++ 下,使用静态/全局作用域声明的变量总是会被初始化。
在某些情况下,以下行为之间实际上可能存在差异:
int x = 0;
int main() { ... }
和
int x;
int main() { ... }
如果您使用共享数据段,那么 VC++ 至少使用显式初始化以及 #pragma data_seg
确定特定变量是否应该进入进程的共享数据段或私有数据段。
为了增加乐趣,请考虑如果您有一个静态 C++ 对象,并且在共享数据段中声明了构造函数/析构函数,会发生什么情况。每次 exe/dll 附加到数据段时都会调用构造函数/析构函数,这几乎肯定不是您想要的。
更多细节在此 知识库文章