内存的一些magic number和debug crt(0xCCCCCCCC和0xCDCDCDCD,debug版本的CRT为了方便调试程序的初始值)
调试过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管理函数,还有以下两点需要注意:
- 如果分配的内存过大(比如几十M,HeapAlloc会转换成用VirtualAlloc来分配,而不是从堆上进行分配,所以分配和释放之后的内存值不是上表所示。
- 开启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为了方便调试程序的初始值)的更多相关文章
- [转载]内存的一些magic number和debug crt
原文:http://www.360doc.com/content/13/0105/17/6295074_258392439.shtml 调试过debug版本的vc程序的人一定对0xCCCCCCCC和0 ...
- 一个快速double转int的方法(利用magic number)
代码: int i = *reinterpret_cast<int*>(&(d += 6755399441055744.0)); 知识点: 1.reinterpret_cast&l ...
- Magic Number(Levenshtein distance算法)
Magic Number Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit ...
- LVM XFS增加硬盘分区容量(resize2fs: Bad magic number in super-block while)
LVM XFS增加硬盘分区容量(resize2fs: Bad magic number -- :: 分类: Linux LVM XFS增加硬盘分区容量(resize2fs: Bad magic num ...
- [ZOJ 3622] Magic Number
Magic Number Time Limit: 2 Seconds Memory Limit: 32768 KB A positive number y is called magic n ...
- poj magic number
Problem H Time Limit : 4000/2000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Sub ...
- ZOJ 3622 Magic Number(数)
题意 假设一个正整数y满足 将随意正整数x放到y的左边得到的数z满足 z%y==0 那么这个数就是个Magic Number 给你一个范围 求这个范围内Magic Number的个数 令 ...
- iOS Exception Code 之 Magic Number
https://en.wikipedia.org/wiki/Hexspeak iOS Exception Code 之 Magic Number 备忘.
- Magic Number (zoj3622)
Magic Number (zoj3622) Time Limit : 4000/2000ms (Java/Other) Memory Limit : 65536/32768K (Java/Oth ...
随机推荐
- C#学习笔记(31)——委托窗体传值
说明(2017-11-23 19:31:53): 1. 关于委托和窗体传值,一下午在网上查阅了大量资料,基本就是CSDN的论坛和博客园的文章,大家都在举例子,烧水.鸿门宴,看评论说还看到过沙漠足球的, ...
- Java知多少(76)语言包(java.lang)简介
Java语言包(java.lang)定义了Java中的大多数基本类,由Java语言自动调用,不需要显示声明.该包中包含了Object类,Object类是整个类层次结构的根结点,同时还定义了基本数据类型 ...
- 缓存Memcached 与 Redis 相同点差异点分析
memcach简介 Memcache时一个内存对象缓存系统,用于加速动态web应用程序,减轻数据库负载.它可以应对任意多个连接,使用非阻塞的网络I/O,工作机制:在内存中开辟一块空间,然后建立一个ha ...
- What exactly can you do with Python? Here are Python’s 3 main applications._你能用Python做什么?下面是Python的3个主要应用程序。
原文链接 Github地址 一.陈述 1,我到底能用Python做什么? 我观察注意到Python三个主要流行的应用: 网站开发: 数据科学——包括机器学习,数据分析和数据可视化: 做脚本语言. 二. ...
- [TF] Architecture - Computational Graphs
阅读笔记: 仅希望对底层有一定必要的感性认识,包括一些基本核心概念. Here只关注Graph相关,因为对编程有益. TF – Kernels模块部分参见:https://mp.weixin.qq.c ...
- 通信原理之IP协议,ARP协议 (三)
把这三个协议放到一起学习是因为这三个协议处于同一层,ARP协议用来找到目标主机的Ethernet网卡Mac地址,IP则承载要发送的消息.数据链路层可以从ARP得到数据的传送信息,而从IP得到要传输的数 ...
- Kafka ACL使用实战
自0.9.0.0.版本引入Security之后,Kafka一直在完善security的功能.当前Kafka security主要包含3大功能:认证(authentication).信道加密(encry ...
- 从Elasticsearch来看分布式系统架构设计
分布式系统类型多,涉及面非常广,不同类型的系统有不同的特点,批量计算和实时计算就差别非常大.这篇文章中,重点会讨论下分布式数据系统的设计,比如分布式存储系统,分布式搜索系统,分布式分析系统等. 我们先 ...
- NIO相关概念之Channel
通道(Channel)是java.nio的第二个主要创新.它们既不是一个扩展也不是一项增强,而是全新.极好的Java I/O示例,提供与I/O服务的直接连接.Channel用于在字节缓冲区和位于通道另 ...
- C# 数组转json
////////试题信息///////////////// // 已知 // h.d两个数组分别表示表头和内容 // 要求 // 编写函数一:rs2Array // 返回一个数组,每一项为一个对象. ...