MSVC內存管理器具有某些十六進制代碼,它在調試版本中使用,以根據執行的操作標記內存。這些文件記錄在here。涉及填充時MSVC初始化堆
特別是,代碼0xCDCDCDCD用於標記分配但未初始化的堆內存。假設我有以下結構:
struct Test
{
bool foo;
int value;
Test() : foo(false), value(0) {}
};
當我分配此對象,將我的記憶是這樣的(注意,我寫出來的十六進制字節,因爲它們將出現在順序,字節序尚未考慮對於這個例子)?
00 CD CD CD CD 00 00 00 00
以上,00 CD CD CD
表示4字節對齊布爾值。最後3個字節是0xCD
,因爲內存管理器將這些值初始化爲CD,但由於布爾值僅代表我機器上的1個字節,所以結構中該布爾值的實際初始化只觸及1個字節。
這是正確的行爲嗎?
只是好奇 - 你爲什麼問?爲什麼你不檢查? – littleadv
我在問,因爲我有一個對齊問題,我看到值'00 CD CD CD',我的布爾成員之一,我只是想確認該程序只是初始化的第一個字節四。如果是這種情況,那麼我可以解釋爲什麼最後3個字節是0xCD –
@Robert,你不應該根據對齊部分的內容做出任何決定,因爲它的確定了implmentation並且可以包含任何隨機數據。 –