什么时候以及为什么编译器会在malloc / free / new / delete上将内存初始化为0xCD,0xDD等?

问题描述 投票:122回答:9

我知道编译器有时会使用某些模式(例如0xCD0xDD)初始化内存。我想知道的是whenwhy发生这种情况。

何时

这是特定于所使用的编译器吗?

malloc/newfree/delete在此方面是否以相同的方式工作?

是否特定于平台?

[在LinuxVxWorks等其他操作系统上会发生吗?

为什么

我的理解是,这仅在Win32调试配置中发生,它用于检测内存溢出并帮助编译器捕获异常。

您能提供有关此初始化如何有用的任何实际示例吗?

[我记得读过一些内容(也许在代码完成2中),说在分配内存时将内存初始化为已知模式是很好的,并且某些模式会触发Win32中的中断,这将导致调试器中显示异常。] >

这有多便携?

我知道编译器有时会使用某些模式(例如0xCD和0xDD)初始化内存。我想知道的是何时以及为什么发生这种情况。什么时候专用于编译器? ...

c++ c memory memory-management
9个回答
187
投票

Microsoft编译器在调试模式下编译时用于各种未拥有/未初始化的内存的简要说明(支持可能会因编译器版本而异:


36
投票

关于填充值0xCCCCCCCC的一个不错的属性是,在x86汇编中,操作码0xCC是int3操作码,它是软件断点中断。因此,如果您尝试在已填充该填充值的未初始​​化内存中执行代码,则会立即遇到断点,并且操作系统将允许您附加调试器(或终止进程)。


7
投票

是特定于编译器和OS的,Visual Studio会将不同类型的内存设置为不同的值,以便在调试器中可以轻松查看是否已将内存分配到已分配的内存,固定数组或未初始化的对象中。我正在搜寻它们时,会有人发布详细信息...


4
投票

这不是操作系统,而是编译器。您也可以修改行为-请查看此帖子的底部。


4
投票

这是特定于所使用的编译器吗?


2
投票
本文介绍了unusual memory bit patterns和遇到这些值时可以使用的各种技术。

2
投票
“为什么”的明显原因是假设您有一个这样的类:

2
投票
通常在调试期间,很容易看到内存已从其初始起始值发生了变化,因为有时可以在运行过程中将调试器附加到进程,因此有时还会发布代码。

1
投票
IBM XLC编译器具有“ initauto”选项,该选项将为自动变量分配您指定的值。我将以下内容用于调试版本:
© www.soinside.com 2019 - 2024. All rights reserved.