注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

信息 灵感 创新

I? =Information,Inspiration,Innovation

 
 
 

日志

 
 
关于我

we are 5. Mathematics, Computation, Programming, Engineering, and Making fun of life.

网易考拉推荐

【转载】[VC][内存]关于“烫烫烫”和“屯屯屯”  

2014-07-17 14:23:18|  分类: C & C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

一、开始

刚从围脖看到一个烫烫烫的笑话,比较累了,简单来一下。

 

二、大概情况

当你编译处于Debug模式下的Visual Studio的程序时候,你会发现申请或销毁的内存具有奇怪的值,比如:0xCDCDCDCD或者0xDDDDDDDD,这是为在Win32平台下对内存的保护,防止泄露的措施。

运行时检查是VC编译器提供了运行时刻的对程序正确性/安全性的一种动态检查,可以在项目的C++选项中打开Small Type Check和Basic Runtime Checks来启用Runtime Check。
同时,也可以使用/RTC开关来打开检查,/RTC后面跟c, u, s代表启用不同类型的检查。Smaller Type Check对应/RTCc, Basic Runtime Checks对应/RTCs和/RTCu。

 [VC][内存]关于“烫烫烫”和“屯屯屯” - 熊哥 - 熊哥

三、举例说明

1.例子

  1: //---------------------------------------------- 
  2: // 说明:运行时检查测试 
  3: // 环境:VS2008 
  4: // 作者:http://pppboy.blog.163.com
  5: // 时间:2011.11.30 
  6: //--------------------------------------------- 
  7:  
  8: #include "stdafx.h" 
  9: #include <iostream> 
 10: using namespace std; 
 11:  
 12: //为了清楚,设置为5个汉字 
 13: const int MAX_LEN(11); 
 14:  
 15: int main(int argc, char* argv[]) 
 16: { 
 17:   //栈 
 18:   char cTang[MAX_LEN]; 
 19:   cTang[MAX_LEN - 1] = 0; 
 20:  
 21:   //堆 
 22:   char* pTun = new char[MAX_LEN]; 
 23:   pTun[MAX_LEN - 1] = 0; 
 24:  
 25:   cout << cTang << "\n"; 
 26:   cout << pTun << "\n"; 
 27:  
 28:   //值 
 29:   cout <<  static_cast<int>(cTang[0]) << "\n"; 
 30:   cout <<  static_cast<int>(pTun[0]) << "\n"; 
 31:  
 32:   delete [] pTun; 
 33:   pTun = NULL; 
 34:  
 35:   system("pause"); 
 36:   return 0; 
 37: } 
 38: 

用Debug编译输出:

烫烫烫烫烫 
屯屯屯屯屯 
-52 
-51 
请按任意键继续. . .

Release的输出:

(0@ 
瓠侯 
40 
13 
请按任意键继续. . .

2.说明

我们在29行定一个断点,Debug调试查看一下cTang和pTun的值。

[VC][内存]关于“烫烫烫”和“屯屯屯” - 熊哥 - 熊哥

[VC][内存]关于“烫烫烫”和“屯屯屯” - 熊哥 - 熊哥

可以看到Debug模式下

(1)我们的栈都用了0xcc填充,堆都用了0xcd填充,而不是空,也不是原来的本来内存。

(2)

栈空间未初始化的字符默认是-52,补码是0xCC,1个BYTE。两个就是0xCCCC. 0xCCCC在GBK编码中就是"烫"。

堆空间未初始化的字符默认是-51,补码是0xCD,两个-51在GBK编码中就是“屯”。

(3)

Release模式下,内存没有进行任何填充,原来是啥还是啥。

 

四、理论参考

名字      描述
0xCD   Clean Memory    申请的内存由malloc或者new完成
0xDD   Dead Memory    释放后的内存,用来检测悬垂指针
0xFD   Fence Memory    动态申请后的内存值,没有初始化。用来检测数组的下标界限
0xAB   (Allocated Block?)    使用LocalAlloc()分配的内存 0x0DF0ADBA  Bad Food     使用LocalAlloc并且参数为LMEM_FIXED,但是还没写入
0xCC    使用了/GZ选项,没有初始化的自动变量在DBGHEAP.C文件中,


有如下的定义:
static unsigned char _bNoMansLandFill = 0xFD;   /* fill no-man's land with this */ 
static unsigned char _bDeadLandFill   = 0xDD;   /* fill free objects with this */static unsigned char _bCleanLandFill  = 0xCD;   /* fill new objects with this */

Function    Description
malloc    C/C++ 使用来申请内存空间,在C++中操作符new是在malloc的基础上被重载的_malloc_dbg   只有在Debug模式下才有效
free    C/C++ 用来释放内存空间,在C++中操作符delete是在free的基础上被重载的_free_dbg   只有在Debug模式下才有效
LocalAlloc  Win32 API,Windows内存管理器不会提供本地和全不堆LocalFree   Win32 API释放内存对象的句柄
HeapAlloc   Win32 APIHeapFree   Win32 API

 

五、参考文章和链接:

《程序员的自我修养—链接、装载与库》

http://hi.baidu.com/deep_pro/blog/item/220df2ddcf40d0d18c10295c.html

http://blog.csdn.net/qianxin_hit/article/details/6128291

http://blog.csdn.net/atfield/article/details/1556844

http://blog.csdn.net/chenyu2202863/article/details/2555780

本文地址:

http://pppboy.blog.163.com/blog/static/30203796201110301299993/

对于本文,您可以随意转载修改使用,但请不要误导他人。

  评论这张
 
阅读(352)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016