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. 大型网站技术架构(2):架构要素和高性能架构
  2. Python_divmod() 函数简单说明
  3. wordpress更新时需要ftp的解决方法
  4. sdutoj-4209-移动小球
  5. mysql 1067 42000_MySQL:ERROR 1067 (42000): Invalid default value for 'end_time'
  6. C#如何测试代码运行时间
  7. ZooKeeper学习第四期---构建ZooKeeper应用
  8. 2018-2019-2 20175311 实验一《Java开发环境的熟悉》实验报告
  9. Deno 是面向代码的浏览器?
  10. oracle11g更改字符集AL32UTF8为ZHS16GBK及创建用户、删除用户
  11. 如何在xcode中使用storyboard
  12. 目标检测+双目测距——基于yolov5
  13. 如何设置PPT里的表格行高等高
  14. mysql405错误_转-------HTTP 405 错误 – 方法不被允许 (Method not allowed)
  15. hermite spline
  16. 【vbers】ibv_reg_mr|RDMA
  17. php7垃圾回收机制l_从几个简单的程序看PHP的垃圾回收机制
  18. Flutter实战-请求封装(五)之Isolate线程改造
  19. 测试服务器端口是否打开的几种办法
  20. 机器学习论文源代码浅读:Autoformer

热门文章

  1. 文章点赞以及取消点赞功能
  2. python学习——函数及其参数
  3. mysql慢查询分析工具和分析方法
  4. iOS开发:icon和启动图尺寸(转)
  5. 2017华南理工华为杯H bx值(容斥问题)
  6. ntp 配置详解(转载后整理汇总)
  7. AJAX 大数据量处理
  8. 与图论的邂逅09:树上启发式合并
  9. TZOJ 2099 Sightseeing tour(网络流判混合图欧拉回路)
  10. ssh整合,明明已经导入包,却总是有很多ClassNotFoundException