![]() |
1
17
假设你没有修改
你说得对
|
![]() |
2
1
Actually some of the values being zero may be due to you trying this code in the debug version of the application (if that is the case). 如果我没有弄错,在你的代码中:
|
![]() |
3
1
请注意,操作系统作为安全功能完成的零初始化通常只在第一次分配内存时完成。我指的是堆、堆栈和数据段中的任何段。堆栈和数据部分的大小通常是固定的,并且在应用程序加载到内存中时进行初始化。 数据段(包含静态/全局数据和代码)通常不会得到“重用”,尽管如果在运行时动态加载代码,情况可能不会如此。 堆栈段中的内存将一直重复使用。局部变量、函数堆栈帧等。它们都在不断地被使用和重复使用,并且不是每次都初始化——只是在首次加载应用程序时。 但是,当应用程序请求堆内存时,内存管理器通常会在授予请求之前将内存段初始化为零,但只对新的段进行初始化。如果您请求堆内存,并且已经初始化的段中有可用空间,则不会再次进行初始化。因此,不能保证如果应用程序重新使用特定内存段,它将再次初始化为零。 因此,例如,如果在堆上分配一个foo,给它的字段赋值,删除foo实例,然后在堆上创建一个新foo,那么新foo有可能被分配到与旧foo相同的内存位置,因此它的字段最初的值与旧foo的字段相同。 如果您考虑一下,这是有意义的,因为操作系统只是初始化数据以防止一个应用程序从另一个应用程序访问数据。允许应用程序访问其自己的数据的风险较小,因此出于性能原因,并非每次都进行初始化—只是第一次将特定内存段提供给应用程序使用(在任何段中)。 但是,有时在调试模式下运行应用程序时,某些调试模式运行时会在每次分配时初始化堆栈和堆数据(因此FOO字段将始终初始化)。但是,不同的调试运行时将数据初始化为不同的值。Some zero initialize, and some initialize to a "marker" value. 关键是-永远不要在代码中的任何地方使用未初始化的值。绝对不能保证它们将被初始化为零。另外,请务必阅读前面链接的关于parens和default vs value初始化的文章,因为这会影响“未初始化”值的定义。 |
![]() |
4
0
对我来说,pod类型是根据所放置的内存部分初始化的。你的
|
![]() |
5
0
它们不会。调试位版本可能会这样做,但通常它只是放在内存中,并初始化为内存中的值。 |
![]() |
KiraHoneybee · 具有构造函数参数的模板化类 2 年前 |
![]() |
nick2225 · 隐式调用复制构造函数? 2 年前 |
![]() |
nohaga · 为什么在本例中p3需要默认构造函数? 2 年前 |
![]() |
Aadil Hoda · 为什么类类型的成员需要初始化? 2 年前 |
![]() |
EloiGG · 具有任意类型的变量的可数的C++函数 2 年前 |