最近使用 VS 開發(fā) c++ 的 dll 虎忌,發(fā)現(xiàn) vc++ 對野指針归粉、空指針椿疗、未初始化內存等導致的內存錯誤報有特定錯誤碼:0xCDCDCDCD
, 0xDDDDDDDD
, 0xFEEEFEEE
, 0xCCCCCCCC
, 0xABABABAB
。
Google上對上述錯誤碼的解釋如下:
-
0xCDCDCDCD
- Created but not initialised 未初始化的堆內存 -
0xDDDDDDDD
- Deleted 引用的內存已經/對象被刪除 -
0xFEEEFEEE
- Freed memory set by NT's heap manager -
0xCCCCCCCC
- Uninitialized locals in VC6 when you compile w/ /GZ 未初始化的棧內存 -
0xABABABAB
- Memory following a block allocated by LocalAlloc()
原理
VC++ 在 Debug 方式編譯的程序中盏浇,會跟蹤用 new 分配的內存变丧。新分配的內存會用 0xcd
(Cleared Data)填充,防止未初始化绢掰。當它被 delete 后,又會被 0xdd
(Dead Data)填充,防止再次被使用滴劲。這樣有利于調試內存錯誤攻晒。之所以選這樣的填充模式,是因為:
- 大數班挖,若被當成指針就會越界
- 奇數鲁捏,指針通常指向偶數地址
- 非0, 這樣不會和 NULL 混淆。
在 Release
版中不會有這些字節(jié)填充