可能重複:
When and why will an OS initialise memory to 0xCD, 0xDD, etc. on malloc/free/new/delete?爲什麼未分配的內存標記爲0xCC?
爲什麼內存我還沒有初始化設置爲0xCC
?
將存儲器設置爲0xCC
會降低性能,因此必須以此字節填充內存。
可能重複:
When and why will an OS initialise memory to 0xCD, 0xDD, etc. on malloc/free/new/delete?爲什麼未分配的內存標記爲0xCC?
爲什麼內存我還沒有初始化設置爲0xCC
?
將存儲器設置爲0xCC
會降低性能,因此必須以此字節填充內存。
Inside CRT: Debug Heap Management
當您編譯與Visual Studio和 在調試器中運行你的程序的調試版本,你可以看到,內存分配或解除分配 有搞笑的價值,如...
0xCC當使用/ GZ選項編譯代碼時,未初始化的 變量將自動分配給此值(在字節級別)。
CCCCCCCC微軟的C++調試運行時庫用來標記 未初始化的堆棧存儲器
在Visual Studio CRT源,\VC\crt\src\malloc.h
:
#define _ALLOCA_S_STACK_MARKER 0xCCCC
// ...
#undef _malloca
#define _malloca(size) \
__pragma(warning(suppress: 6255)) \
((((size) + _ALLOCA_S_MARKER_SIZE) <= _ALLOCA_S_THRESHOLD) ? \
_MarkAllocaS(_alloca((size) + _ALLOCA_S_MARKER_SIZE), _ALLOCA_S_STACK_MARKER) : \
_MarkAllocaS(malloc((size) + _ALLOCA_S_MARKER_SIZE), _ALLOCA_S_HEAP_MARKER))
使用/ GZ選項編譯代碼時,未初始化的變量會自動分配給此值(在字節級別)。
0xCC是調用斷點的機器碼指令。欲瞭解更多信息see another question。
編譯器會在調試模式下爲您執行此操作,因此如果您意外讀取未初始化的內存,您將看到獨特的0xCC值,並認識到您(可能)讀取未初始化的內存。 0xCC值有許多其他有用的屬性,例如,如果意外執行一些未初始化的內存,它就是用於調用硬件斷點的機器語言指令。
基本原理:可以很容易地識別來自讀取未初始化內存的值。
這不會發生在您的發佈版本中。
此技術是在Writing Solid Code中引入的。
關於此問題的權威答案在此:http://stackoverflow.com/questions/370195/when-and-why-will-an-os-initialise-memory-to-0xcd-0xdd-etc-on- malloc的,自由的新 – 2012-08-08 12:51:03