VS2013 调试时的 0xCCCCCCCC 读取字符串的字符时出错

By | 06月27日
Advertisement

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
0xfeeefeee : Used by Microsoft's HeapFree() to mark freed heap memory
对于0xcccccccc和0xcdcdcdcd,在 Debug 模式下,VC 会把未初始化的栈内存上的指针全部填成 0xcccccccc ,当字符串看就是 “烫烫烫烫……”;会把未初始化的堆内存上的指针全部填成 0xcdcdcdcd,当字符串看就是 “屯屯屯屯……”。那么调试器为什么要这么做呢?VC的DEBUG版会把未初始化的指针自动初始化为0xcccccccc或0xcdcdcdcd,而不是就让取随机值,那是为了方便我们调试程序,如果野指针的初值不确定,那么每次调试同一个程序就可能出现不一样的结果,比如这次程序崩掉,下次却能正常运行,这样显然对我们解bug是非常不利的,所以自动初始化的目的是为了让我们一眼就能确定我们使用了未初始化的野指针了。
对于0xfeeefeee,是用来标记堆上已经释放掉的内存。注意,如果指针指向的内存被释放了,变量变量本身的地址如未做改动,还是之前指向的内存的地址。如果该指针是一个类的指针,并且类中包含有指针变量,则内存被释放后(对于C++类,通常是执行delete操作),类中的指针变量就会被赋值为0xfeeefeee。如果早调试代码过程中,发现有值为0xfeeefeee的指针,就说明对应的内存被释放掉了,我们的代码已经出问题了。
关于VC 中 debug和Release模式下的变量初始化问题大家都知道,debug跟release在初始化变量时所做的操作是不同的,debug是将每个字节位都赋成0xcc,而release的赋值近似于随机(我想是直接从内存中分配的,没有初始化过)。这样就明确了,如果你的程序中的某个变量没被初始化就被引用,就很有可能出现异常:用作控制变量将导致流程导向不一致;用作数组下标将会使程序崩溃;更加可能是造成其他变量的不准确而引起其他的错误。所以在声明变量后马上对其初始化一个默认的值是最简单有效的办法,否则项目大了你找都没地方找。代码存在错误在debug方式下可能会忽略而不被察觉到,如debug方式下数组越界也大多不会出错,在 release中就暴露出来了,这个找起来就比较难了。

Similar Posts:

  • VS2013 调试时读取字符串的字符时出错

    在 Debug 模式下,VC 会把未初始化的栈内存上的指针全部填成 0xcccccccc ,当字符串看就是 "烫烫烫烫--": 会把未初始化的堆内存上的指针全部填成 0xcdcdcdcd,当字符串看就是 "屯屯屯屯--". 那么调试器为什么要这么做呢? VC的DEBUG版会把未初始化的指针自动初始化为0xcccccccc或0xcdcdcdcd,而不是就让取随机值,那是为了方便我们调试程序,如果野指针的初值不确定,那么每次调试同一个程序就可能出现不一样的结果,比如这次

  • 关于chrome浏览器下使用js读取本地json文件时提示“Origin null is not allowed by Access-Control-Allow

    使用chrome读取本地json文件时提示"Origin null is not allowed by Access-Control-Allow-Origin", 意思是"由于安全原因浏览器不允许跨域访问".进一步查找相关问题资料,上述问题是因为,chrome和firefox于安全限制的原因,本地调试JS,如果不在服务器环境而直接打开页面,那所有的AJAX操作会抛出下面错误. 可以通过–disable-web-security 来解决. 具体做法是:右键chrome

  • DOM4J 读取文件 读取字符串

    通常情况下,我们需要用dom4j读取本地的配置文件,其文件格式为xml格式,但是有时候却需要读取例如数据库中保存好的xml形式的数据,这儿就得读取xml格式的字符串,一下提供两种读取方式. 第一,读取文件里面的内容: File file = new File("c:\\test.txt"); org.dom4j.io.SAXReader reader = new org.dom4j.io.SAXReader(); Document document = reader.read(file

  • PHP中判断字符串是否包含某个字符时,建议使用正则表达式preg_match()

    判断字符串中是否包含 某个字符时,在java中时直接使用 indexOf()来判断的 在php中好像也要对应的,strpos(),stripos() 不过每次我用的都很不爽,老是出现各种各样的小问题, 而使用正则表达式,最起码让我觉得比较靠谱 eg: 判断字符串中是否包含 星号* 使用 preg_match($rule,$string) $rule:是正则表达式,php中的正则表达式都得写在'/内容/'中, eg:符合小写和大写字母以及数字的正则表达式 '/[a-zA-Z0-9]/' $stri

  • js数值和和字符串进行转换时可以对不同进制进行操作

    Javascript数值和和字符串进行转换时,可以对不同的进制进行操作. 转换例子如下: 代码如下: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>带进制的数值和字符串间进行转换</title> </head> <body> <script la

  • 当s中的字符串为“123456”时,则逆序输出其奇数位置上的字符 “664422”。

    编程将在字符串s中下标为奇数位置上的字符,紧随其后重复出现一次,放在一个新串t中,t中字符按原字符串中字符出现的逆序排列(注意0为偶数). 例如:当s中的字符串为"123456"时,则t中的字符串应为"664422". #include<stdio.h> #include<string.h> void main() { int n,i,k,j=0; char str[10],string[10]; printf("请输入字符串:&q

  • Swift 字符串和字符(Strings and Characters)

    String是例如"hello, world","albatross"这样的有序的Character(字符)类型的值的集合,通过String类型来表示. Swift 的String和Character类型提供了一个快速的,兼容 Unicode 的方式来处理代码中的文本. 创建和操作字符串的语法与 C 语言中字符串操作相似,轻量并且易读. 字符串连接操作只需要简单地通过+符号将两个字符串相连即可. 与 Swift 中其他值一样,能否更改字符串的值,取决于其被定义为常量

  • Swift和Java关于字符串和字符的比较

    1. 字符串字面量 Swift和Java关于字符串操作大同小异. Swift:字符串字面量(String Literals):我们可以在代码中包含一段预定义的字符串值作为字符串字面量. 字符串字面量是由双引号 ("") 包裹着的具有固定顺序的文本字符集.字符串字面量可以用于为常量和变量提供初始值. 代码如下: let someString = "Some string literal value" 字符串字面量可以包含以下特殊字符: 转义字符\0(空字符).\\(反

  • The Swift Programming Language-官方教程精译Swift(4)字符串和字符

    String 是一个有序的字符集合,例如 "hello, world", "albatross".Swift 字符串通过 String 类型来表示,也可以表示为 Character 类型值的集合. Swift 的 String 和 Character 类型提供了一个快速的,兼容 Unicode 的方式来处理代码中的文本信息.创建和操作字符串的语法与 C的操作方式相似,轻量并且易读.字符串连接操作只需要简单地通过 + 号将两个字符串相连即可.与 Swift 中其他值一

  • C语言中字符串与字符数组分析

    字符串并不是C语言中默认存在的类型,但是由于字符串的实用性,在谭浩强C语言中有对字符串的一些描述,但是不是特别的详细.有时候写代码时都不会注意到一些小细节,本文就结合实验分析一下字符串与字符数组之间的差别. 字符串与字符数组的区别在过去我一直是处于一知半解的状态,字符串是通常被认为是常量,是保存在一段固定的内存中的,这段内存是以'\0'为结束符,这段内存通常只能通过一个指针来找到.字符数组其实和其他数组没什么区别,只是保存的数据类型是字符类型(char),它没有强制要求最后的元素是否是'\0'.

Tags: