2012-08-08 184 views
7

可能重複:
When and why will an OS initialise memory to 0xCD, 0xDD, etc. on malloc/free/new/delete?爲什麼未分配的內存標記爲0xCC?

爲什麼內存我還沒有初始化設置爲0xCC

將存儲器設置爲0xCC會降低性能,因此必須以此字節填充內存。

+0

關於此問題的權威答案在此: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

回答

14

Inside CRT: Debug Heap Management

當您編譯與Visual Studio和 在調試器中運行你的程序的調試版本,你可以看到,內存分配或解除分配 有搞笑的價值,如...

0xCC當使用/ GZ選項編譯代碼時,未初始化的 變量將自動分配給此值(在字節級別)。

Magic Number on Wiki

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)) 
2

使用/ GZ選項編譯代碼時,未初始化的變量會自動分配給此值(在字節級別)。

0xCC是調用斷點的機器碼指令。欲瞭解更多信息see another question

5

編譯器會在調試模式下爲您執行此操作,因此如果您意外讀取未初始化的內存,您將看到獨特的0xCC值,並認識到您(可能)讀取未初始化的內存。 0xCC值有許多其他有用的屬性,例如,如果意外執行一些未初始化的內存,它就是用於調用硬件斷點的機器語言指令。

基本原理:可以很容易地識別來自讀取未初始化內存的值。

這不會發生在您的發佈版本中。

此技術是在Writing Solid Code中引入的。