• 堆内存里的各种奇怪填充值


    2012-6-27整理

    cswuyg

    前几天遇到过一种奇葩的代码,用0xFEEEFEEE来判断是否是悬垂指针,这种必须反对,太冒险了。

    另外填充值到底是什么呢?发觉要全面彻底分析,不是那么简单,最后只是把网络上的一些资料拿到这里,作为记录。

    一、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测试它们的这些区别。

    附上网络上的非常详细的解释:

    * 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

     参考资料:网络上非常多,就不列举了。

  • 相关阅读:
    hdu 1423 LICS
    poj 1135
    poj 1112
    poj 1087
    poj 1094
    谷歌浏览器字体小于12px不能正常显示bug
    gulpfile.js配置 实现ctrl+s自动编译和刷新浏览器
    <hr>标签横线的颜色
    jQuery轮播图鼠标移入停止,移出播放,点击小横条切换图片
    最简单的jq轮播图
  • 原文地址:https://www.cnblogs.com/cswuyg/p/2580824.html
Copyright © 2020-2023  润新知