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

堆内存里的各种奇怪填充值相关推荐

  1. 什么变量在堆内存里存放,什么变量在栈内存里存放

    堆和栈的区别 (stack and heap) 一般认为在c中分为这几个存储区 1栈 - 有编译器自动分配释放 2堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 3全局区(静态 ...

  2. JVM堆内存与垃圾收集器

    3.1 谈谈Java中不同的引用类型? Java里有不同的引用类型,分别是强引用.软引用.弱引用和虚引用; 强引用:Object object = new Object();即使内存溢出了也不会回收这 ...

  3. jvm from space 很小_JVM真香系列:堆内存详解

    前面的文章中已经有所提到过堆,只是大致介绍了一下.本文就来详细聊聊JVM中的堆. 在 JVM中,堆被划分成两个不同的区域:新生代 ( Young ).老年代 ( Old ). 新生代 ( Young ...

  4. JVM学习笔记之-堆,年轻代与老年代,对象分配过程,Minor GC、Major GC、Full GC,堆内存大小与OOM,堆空间分代,内存分配策略,对象分配内存,小结堆空间,逃逸分析,常用调优工具

    堆的核心概述 概述 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域.Java堆区在JVM 启动的时候即被创建,其空间大小也就确定了.是JVM管理的最大一块内存空间. 堆内存的大小是可 ...

  5. java堆内存_java堆内存模型

    广泛地说,JVM堆内存被分为两部分--年轻代(Young Generation)和老年代(Old Generation). 年轻代 年轻代是所有新对象产生的地方.当年轻代内存空间被用完时,就会触发垃圾 ...

  6. JVM堆内存(heap)

    堆的核心概述 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域. Java堆区在JVM启动的时候即被创建,其空间大小也就确定了.是JVM管理的最大1块内存空间.堆内存的大小是可以调节的 ...

  7. JVM堆内存介绍、垃圾收集算法、垃圾回收器汇总

    目录 1. JAVA堆内存是如何划分的 1.1 为什么移除永久代? 1.2 分代概念 1.3 为什么分代? 1.4 为什么survivor分为两块相等大小的幸存空间? 1.5 JVM堆内存常用参数 2 ...

  8. 数据存在内存里的格式是什么?

    计算机基础课第 32 期分享 上节讲了一些经典算法,比如给数组排序,找图的最短路径. 而上节没讲的是算法处理的数据存在内存里的格式是什么? 你肯定不想数据像 John Green 的大学宿舍一样乱,到 ...

  9. 调整JVM堆内存解决OutOfMemoryError

    今天在用 processing(http://zh.wikipedia.org/wiki/Processing) 编写处理 midi 文件的程序的时候,遇到了一个问题.程序主要是读取分析 midi , ...

最新文章

  1. OUYA游戏开发快速入门教程
  2. matlab datetime时间处理、时间转换
  3. 按钮右对齐_Python Tkinter Button按钮
  4. Java CAS 和ABA问题
  5. 说学习前端开发简单,如何才能成功上岸?
  6. 【java笔记】File类(2):获取,判断,创建,删除,遍历目录方法
  7. python四种可变类型_python中可变类型与不可变类型 + 类型转换
  8. vue 时间插件限制选择时间
  9. 2022年熔化焊接与热切割考试模拟100题及在线模拟考试
  10. 转载-信息化与系统集成技术-全面解析工业4-0和云计算、大数据
  11. GitHub 新建的仓库如何导入老项目?
  12. 生成树技术(spanning tree)技术
  13. 分享几个国内外安全专家常用的漏洞库平台
  14. 2019长江课堂作业答案_2019年长江作业本同步练习册三年级语文下册人教版答案...
  15. FastqC结果简介
  16. 三问中国电子云,此时入局的深意是什么?
  17. 第1章 游戏之乐——连连看游戏设计
  18. RAM、ROM、emmc、iNand、SD卡、mmc 与 Nandflash 的区别
  19. May 17th Thursday (五月 十七日 木曜日)
  20. Linux Graphics 周刊(第 9 期)

热门文章

  1. PXE-cobbler 无人值守装机------续
  2. Oracle DBA课程系列笔记(4)
  3. BZOJ 2708 [Violet 1]木偶 DP
  4. python高级-------python2.7教程学习【廖雪峰版】(四)
  5. 带动态属性的自定义标签
  6. 修改tomcat控制台title的方法
  7. iOS开发——高级篇——iOS开发之网络安全密码学
  8. 浅说项目管理中的Action以及3W1P原则
  9. 如何用 JavaScript 下载文件
  10. asp.net mvc 过滤器