堆内存里的各种奇怪填充值
来源:互联网 发布:周琦体测数据曝光 编辑:程序博客网 时间:2024/06/03 08:17
http://www.cnblogs.com/cswuyg/archive/2012/07/07/2580824.html
附上网络上的非常详细的解释:
* 0xABABABAB : Used by Microsoft's HeapAlloc() to mark "no man's land" guard bytes after allocated heap memory
* 0xABADCAFE : A startup to this value to initialize all free memory to catch errant pointers
* 0xBAADF00D : Used by Microsoft's LocalAlloc(LMEM_FIXED) to mark uninitialised allocated heap memory
* 0xBADCAB1E : Error Code returned to the Microsoft eVC debugger when connection is severed to the debugger
* 0xBEEFCACE : Used by Microsoft .NET as a magic number in resource files
* 0xCCCCCCCC : Used by Microsoft's C++ debugging runtime library to mark uninitialised stack memory
* 0xCDCDCDCD : Used by Microsoft's C++ debugging runtime library to mark uninitialised heap memory
* 0xDEADDEAD : A Microsoft Windows STOP Error code used when the user manually initiates the crash
* 0xFDFDFDFD : Used by Microsoft's C++ debugging heap to mark "no man's land" guard bytes before and after allocated heap memory
* 0xFEEEFEEE : Used by Microsoft's HeapFree() to mark freed heap memory
一、Release下,用OllyDbg查看
1、申请了50个字节的空间。可以看到被初始化为0xBAADF00D。
2、把申请的内存释放之后,释放之后内存初始化为0xFEEEFEEE。
二、debug下用VS2005查看
1、申请了50个字节的空间。可以看到被初始化为0xcdcdcdcd
2、把申请的内存释放之后,初始化为0xFEEEFEEE
三、总结
按照网络上某篇文章的说法:“CRT通常会调用HeapFree()函数将本内存块归还给win32堆, win32堆会将本内存块填充为0xFEEEFEEE。”也就是说,debug、release下都会出现0xFEEEFEEE,因为它们都会调用HeapFree()函数。
“HeapAlloc()返回的内存总是被一4字节对齐初始化为0xBAADF00D”,也就是说release下的内存,直接就是HeapAlloc操作的结果,外界不再做附加操作。而debug下,则会再初始化一次,变成0xCDCDCDCD。
另外,需要注意,这些信息只是用来了解,不要在程序里利用它们,这是编译器相关的东西。
下边附上在网络上找到的资料,我尝试去验证,但发觉事情没那么简单,即便是在编译器干最少内存附加处理的Release模式下,仍然发现内存空间的申请比之前测试过的GCC复杂了许多,申请8个byte的空间,却看到内存里有40个byte的值发生了变化,最后发觉似乎8byte的空间占据了32byte的内存,没有大把时间花在这里去猜测附加空间以及它的填充值的用途,就这样吧,这些属于比较偏的知识。堆空间的分配细节,相比之下GCC可就简单多了,可以用code::block测试它们的这些区别。
- 堆内存里的各种奇怪填充值
- 堆内存里的各种奇怪填充值
- 堆内存里的各种奇怪填充值
- 各种特殊内存填充的含义
- 奇怪的内存泄漏
- C/C++ 内存分配里的 堆和栈 与数据结构里的 堆和栈
- SQL的各种奇怪错误
- 各种奇怪的javascript语法
- JAVA中内存分配策略里的堆与栈
- 内存堆栈的奇怪现象
- c++中 堆的一个奇怪现象
- 堆的各种操作
- 堆的各种操作
- eclipse编辑窗口里的奇怪字符
- java里的静态成员变量是放在了堆内存还是栈内存
- java里的静态成员变量是放在了堆内存还是栈内存
- java里的静态成员变量是放在了堆内存还是栈内存
- 各种奇怪的生成树问题
- iOS 很全的小技巧集合
- 互联网“顶级运营”攻略
- React-Native学习指南
- 学习ASP.NET MVC5框架揭秘笔记-ASP.NET路由(四)
- 软件工程师的务实职业生涯规划
- 堆内存里的各种奇怪填充值
- MyLifeAssistant升级(模拟服务器)
- wprintf, fork, fwide, get FILE* from a file descriptor
- 学习opencv之添加滚动条到视频中,并实现滚动条随着视频播放自动移动
- python入门笔记--函数中参数传递
- Password hashes dump tools
- 基于STM32的函数信号发生器设计(上:硬件设计)
- HDP 2.2.4 Hue Oozie Editor生成workflow.xml的几点问题
- SSL/TLS协议图解---阮一峰