2011-12-07 47 views
0

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個字節。

這是正確的行爲嗎?

+0

只是好奇 - 你爲什麼問?爲什麼你不檢查? – littleadv

+0

我在問,因爲我有一個對齊問題,我看到值'00 CD CD CD',我的布爾成員之一,我只是想確認該程序只是初始化的第一個字節四。如果是這種情況,那麼我可以解釋爲什麼最後3個字節是0xCD –

+0

@Robert,你不應該根據對齊部分的內容做出任何決定,因爲它的確定了implmentation並且可以包含任何隨機數據。 –

回答

3

試試吧。確保使用/MDd或類似的代碼編譯鏈接到調試運行時。 (VS2010中的答案是肯定的)。

+0

查看Debug版本中的行爲不是一個好策略。當優化器啓動時,會發生不尋常的事情。 –

+2

@Hans,它是實現定義的,MSVC的內存模式填充只發生在調試運行時。這種行爲在優化構建中將是相同的。調試運行時庫二進制文件不會因爲用戶的代碼仍然鏈接到調試運行時而被編譯優化而不會改變。 –

+0

你確實有一點,+1。 –

1

沒有什麼能夠阻止代碼生成器寫入4個字節,如果生成更快的代碼。或者使用memset(),這是MSVC編譯器中的一個常見優化。但那顯然沒有發生。無論哪種方式都是正確的,讀取結構填充是未定義的行爲。

相關問題