调试过debug版本的vc程序的人一定对0xCCCCCCCC和0xCDCDCDCD这样的内存很有印象。这是debug版本的CRT为了方便调试程序,在分配出来还没有初始化的时候提供的初始值。

实际上,Windows上面还有更多这样的初始值,见下表:

Uninitialized

 

BAADF00D

Used by Microsoft's LocalAlloc/GlobalAlloc/HeapAlloc(LMEM_FIXED) to mark uninitialised allocated heap memory

CCCCCCCC

Used by Microsoft's C++ debugging runtime library to mark uninitialised stack memory

CDCDCDCD

Used by Microsoft's C++ debugging runtime library to mark uninitialised heap memory

 

 

Freed

 

FEEEFEEE

Used by Microsoft's LocalFree/GlobalFree/HeapFree() to mark freed heap memory

DDDDDDDD

Used by MicroQuill's SmartHeap and Microsoft's C++ debugging heap to mark freed heap memory

 

 

No man's land

 

ABABABAB

Used by Microsoft's LocalAlloc/GlobalAlloc/HeapAlloc() to mark "no man's land" guard bytes after allocated heap memory

FDFDFDFD

Used by Microsoft's C++ debugging heap to mark "no man's land" guard bytes before and after allocated heap memory

表格来源:http://en.wikipedia.org/wiki/Magic_number_(programming)

除了debug CRT会帮你添加这些初始化值之外,微软的堆管理函数也会在分配和释放的时候添加一些初始化值。

LocalAlloc/GlobalAlloc,如果指定的是LMEM_FIXED(默认就指定了这个),并且没有指定LMEM_ZEROINIT,则分配的内存中初始化值为BAADF00D(可以理解成badfood,也就是不能直接吃的意思,呵呵)。调用LocalFree/GlobalFree则其值会变为FEEEFEEE)可以理解成Free)。

HeapAlloc只要没有指定HEAP_ZERO_MEMORY,也是一样初始化值是BAADF00D,HeapFree之后则是FEEEFEEE。

另外,windows的三个heap分配函数(LocalAlloc/GlobalAlloc/HeapAlloc)分配内存的时候,会在分配的内存后面另外添加8个byte的Guard数据,也就是上表中的No man's land。其数值为ABABABAB

关于windows的heap管理函数,还有以下两点需要注意:

  1. 如果分配的内存过大(比如几十M,HeapAlloc会转换成用VirtualAlloc来分配,而不是从堆上进行分配,所以分配和释放之后的内存值不是上表所示。
  2. 开启pageheap之后,调用HeapAlloc分配的初始化值为0xc0c0c0c0。HeapFree之后的内存则无法访问

如果你的内存管理用的是new(malloc)和delete(free)这样的CRT函数,那么情况会更复杂一些。这些CRT内存管理函数是建立在上面的windows heap管理函数之上的。

尤其是debug版本的CRT,会做更多的事情,详细见http://www.nobugs.org/developer/win32/debug_crt_heap.html

这里简要说明一下,new(malloc)分配的未初始化内存的值为CDCDCDCD,delete(free)之后的未初始化值为DDDDDDDD。

另外 ,debug CRT也有跟windows 的 heap管理函数一样的No man's land数据,他们是FDFDFDFD(可以理解成fence),总共8个bytes,4个byte在payload前面 ,4个byte在payload后面。
需要注意的是CRT的管理数据实际上也是windows的heap管理函数的payload,所以当我们用CRT的函数来分配内存时,比如说10bytes,CRT向windows的heap管理函数会需要申请额外的内存(大概是40byte,也就是说总共50byte)。这额外的内存是CRT用来管理CRT内存的,其中就包括No man's land数据,另外还有分配了多少内存,内存类型,调用分配函数时的文件名和行数等等。详细这40bytes作和作用请参见上面的URL

这里还有一些关于Debug CRT的更详细的介绍:http://www.codeguru.com/cpp/w-p/win32/tutorials/article.php/c9535/Inside-CRT-Debug-Heap-Management.htm

值得注意的是,以上是Debug CRT才会有的操作,release版本的CRT是直接调用windows的heap manager函数,所以其表现跟用户直接调用heap manager函数是一样的

https://www.cnblogs.com/georgepei/archive/2012/07/02/2573292.html

内存的一些magic number和debug crt(0xCCCCCCCC和0xCDCDCDCD,debug版本的CRT为了方便调试程序的初始值)的更多相关文章

  1. [转载]内存的一些magic number和debug crt

    原文:http://www.360doc.com/content/13/0105/17/6295074_258392439.shtml 调试过debug版本的vc程序的人一定对0xCCCCCCCC和0 ...

  2. 一个快速double转int的方法(利用magic number)

    代码: int i = *reinterpret_cast<int*>(&(d += 6755399441055744.0)); 知识点: 1.reinterpret_cast&l ...

  3. Magic Number(Levenshtein distance算法)

    Magic Number Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit ...

  4. LVM XFS增加硬盘分区容量(resize2fs: Bad magic number in super-block while)

    LVM XFS增加硬盘分区容量(resize2fs: Bad magic number -- :: 分类: Linux LVM XFS增加硬盘分区容量(resize2fs: Bad magic num ...

  5. [ZOJ 3622] Magic Number

    Magic Number Time Limit: 2 Seconds      Memory Limit: 32768 KB A positive number y is called magic n ...

  6. poj magic number

    Problem H Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Sub ...

  7. ZOJ 3622 Magic Number(数)

    题意  假设一个正整数y满足  将随意正整数x放到y的左边得到的数z满足 z%y==0  那么这个数就是个Magic Number   给你一个范围  求这个范围内Magic Number的个数 令 ...

  8. iOS Exception Code 之 Magic Number

    https://en.wikipedia.org/wiki/Hexspeak  iOS Exception Code 之 Magic Number 备忘.

  9. Magic Number (zoj3622)

    Magic Number (zoj3622) Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Oth ...

随机推荐

  1. Java编程的逻辑 (84) - 反射

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  2. Android 测试入门之---Monkey test

    这周重点学习的也是Android monkey test 的一些相关知识,也对其进行了初步的操作和试验.讲学习资料整理如下 : Monkey是一个命令行工具 ,可以运行在模拟器里或实际设备中.它向系统 ...

  3. 【Git】简单使用

    [Git & Github] 首先不能混淆两者的概念.git是一个类似于svn的版本管理工具.其可以在本地建立起针对一个项目的众多维度的版本管理体系,提升了开发的效率. 相对的,我们如果想要和 ...

  4. 【转】使用Log4Net进行日志记录

    首先说说为什么要进行日志记录.在一个完整的程序系统里面,日志系统是一个非常重要的功能组成部分.它可以记录下系统所产生的所有行为,并按照某种规范表达出来.我们可以使用日志系统所记录的信息为系统进行排错, ...

  5. db2 索引

    索引:可通过 SYSCAT.INDEXES JOIN SYSCAT.INDEXCOLUSE来查询索引的字段有升序ASC和降序DESC,分别表示为SYSCAT.INDEXES的COLNAMES中索引字段 ...

  6. 使用LevelListDrawable实现Html.fromHtml多张图片显示

    stackoverflow网站果然强大,帮了我不少忙! http://stackoverflow.com/questions/16179285/html-imagegetter-textview 首先 ...

  7. 排序算法--选择排序(Selection Sort)_C#程序实现

    排序算法--选择排序(Selection Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来 ...

  8. C# 如何提取字符串中的数字

    下面讲解如何在字符串当中抓取到数字 方法一.使用正则表达式 1.纯数字提取 string str = "提取123abc提取"; //我们抓取当前字符当中的123 string r ...

  9. 使用sts(SpringToolSuite4)无法将项目部署到tomcat容器

    一般情况下maven项目不能添加到tomcat容器中 ,需要在项目上进行设置 但是sts没有安装此插件,可以改用eclipse进行开发.

  10. 快速构建springmvc+spring+swagger2环境

    快速构建springmvc+spring+swagger2环境 开发工具:Intellij idea               jdk: 1.8 开发步骤: 1.创建maven工程,如图建立工程结构 ...