全局内存是用C ++初始化的吗?

时间:2008-09-13 16:13:30

标签: c++ memory memory-management

是否在C ++中初始化了全局内存?如果是这样,怎么样?

(第二)澄清:

当程序启动时,在初始化基元之前,内存空间中的内容将成为全局内存?我试图了解它是否被清零,或者例如垃圾。

情况是:可以在初始化之前通过instance()调用设置单例引用:

MySingleton* MySingleton::_instance = NULL;

并得到两个单例实例?

在单个实例的多个实例上查看我的C ++测验...

4 个答案:

答案 0 :(得分:18)

来自标准:

  

具有静态存储持续时间(3.7.1)的对象应在进行任何其他初始化之前进行零初始化(8.5)。使用常量表达式进行零初始化和初始化统称为静态初始化;所有其他初始化都是动态初始化。具有用常量表达式(5.19)初始化的静态存储持续时间的POD [普通旧数据]类型(3.9)的对象应在任何动态初始化发生之前初始化。在同一翻译单元的命名空间范围内定义并动态初始化的静态存储持续时间的对象应按其定义出现在翻译单元中的顺序进行初始化。 [注意:8.5.1描述了初始化聚合成员的顺序。最初的-   6.7中描述了本地静态对象的实现。]

所以是的,具有静态存储持续时间的全局变量将被初始化。例如,在堆上分配的全局数据当然不会自动初始化。

答案 1 :(得分:8)

是全局基元初始化为NULL。

示例:

int x;

int main(int argc, char**argv)
{
  assert(x == 0);
  int y;
  //assert(y == 0); <-- wrong can't assume this.
}

你不能对堆上的类,结构,数组,内存块做任何假设......

始终初始化所有内容是最安全的。

答案 2 :(得分:6)

来自嵌入式世界...

您的代码被编译为三种类型的内存:
   1.data:初始化的记忆
   2. .text:常量和代码
   3. .bss:未初始化的内存(如果未明确初始化,则在C ++中初始化为0)

如果初始化,全局变量将进入.data。如果不是,则将它们放在.bss中并在预先编码中归零。

答案 3 :(得分:0)

使用static / global范围声明的变量总是至少在VC ++下初始化。

在某些情况下,行为之间实际上可能存在差异:

int x = 0;

int main() { ... }

int x;

int main() { ... }

如果您使用的是共享数据段,那么VC ++至少会使用显式初始化和#pragma data_seg来确定特定变量是应该进入共享数据段还是私有数据段进入进程

为了增加乐趣,请考虑如果您在共享数据段中声明了构造函数/析构函数的静态C ++对象会发生什么。每次exe / dll附加到数据段时都会调用构造函数/析构函数,这几乎肯定不是你想要的。

KB article

中的详细信息