内存中常见异常值的解释(比如0xcccccccc、0xcdcdcdcd和 0xfeeefeee 异常值 )

这篇具有很好参考价值的文章主要介绍了内存中常见异常值的解释(比如0xcccccccc、0xcdcdcdcd和 0xfeeefeee 异常值 )。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/125529931C++软件分析工具从入门到精通案例集锦(专栏文章正在更新中...)https://blog.csdn.net/chenlycly/article/details/131405795C/C++基础与进阶(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/category_11931267.html常见的异常值如下所示:

* 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.

* 0xddddddddUsed by MicroQuill's SmartHeap and Microsoft's C/C++ debug free() function to mark freed heap memory.

* 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.


        在这里,给大家重点推荐一下我的几个热门畅销专栏:

专栏1:(该专栏订阅量接近350个,有很强的实战参考价值,广受好评!)

C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/125529931

本专栏根据近几年C++软件异常排查的项目实践,系统地总结了引发C++软件异常的常见原因以及排查C++软件异常的常用思路与方法,详细讲述了C++软件的调试方法与手段,以图文并茂的方式给出具体的实战问题分析实例,带领大家逐步掌握C++软件调试与异常排查的相关技术,适合基础进阶和想做技术提升的相关C++开发人员!

专栏中的文章都是通过项目实战总结出来的,有很强的实战参考价值!专栏文章还在持续更新中,预计文章篇数能更新到200篇以上!

专栏2: 

C/C++基础与进阶(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/category_11931267.html

本专栏以多年的开发实战为基础,总结并讲解一些的C/C++基础与进阶内容,以图文并茂的方式对相关知识点进行详细地展开与阐述!专栏涉及了C/C++领域的多个方面的内容,同时给出C/C++及网络方面的常见笔试面试题,并详细讲述Visual Studio常用调试手段与技巧!

专栏3: 

VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585

本专栏将10多年C++开发实践中常用的功能,以高质量的代码展现出来,并对相关功能的实现细节进行了详细的说明。这些常用的代码,其质量与稳定性是有保证的,可以直接拿过去使用,可以有效地解决C++软件开发过程中遇到的问题。


1、常见异常值说明

        一般我们只需要了解常见的这4种异常值就可以了:0xcccccccc、0xcdcdcdcd、0xfeeefeee和0xdddddddd,这几个值的说明如上所示。我们需要提高对这几个异常值的敏感度,看到这些值就能大概知道是什么原因引起的,以这个为线索,一般我们就能迅速地分析并定位问题。

1.1、异常值0xcccccccc和0xcdcdcdcd

        对于0xcccccccc和0xcdcdcdcd,在 debug 模式下,Visual Studio会把未初始化的栈内存全部填充成0xcccccccc,当成字符串看就是“烫烫烫烫……”;Visual Studio会把未初始化的堆内存全部填充成 0xcdcdcdcd,当成字符串看就是 “屯屯屯屯……”。这两类特殊的字符串,很多人应该都见到过。

       那么调试器为什么要这么做呢?Visual Studio在debug下把未初始化的内存自动填充成0xcccccccc 或0xcdcdcdcd,而不是随机值,是为了方便我们快速识别出问题,如果内存中出现这两个值,很可能就是因为变量没有初始化导致的。如果内存中的值是随机的,那么每次调试程序时就可能出现不一样的内存值,比如这次程序崩掉,下次却能正常运行,这样显然对我们排解bug是非常不利的。

如果在debug调试时遇到有变量的值为0xcccccccc 或0xcdcdcdcd,一般是变量没有初始化引起的。没有初始化的栈变量(在栈上分配内存的变量)的内存会被初始化为0xcccccccc ,没有初始化的堆变量(在堆上分配内存的变量)的内存会被初始化为0xcdcdcdcd。

        相关项目问题排查实例,可以参见我之前写的文章:

排查软件启动时访问了0xcdcdcdcd内存地址导致内存访问违例的崩溃https://blog.csdn.net/chenlycly/article/details/1252667350xcdcdcdcd异常值引发C++程序崩溃问题的详细分析https://blog.csdn.net/chenlycly/article/details/128380751

1.2、异常值0xfeeefeee 

        对于0xfeeefeee,是Debug下用来标记堆上已经释放掉的内存,即已经释放的堆内存中会被填充成0xfeeefeee。注意,如果指针指向的内存被释放了,指针变量本身的地址是没做改变的,还是其之前指向的内存的地址,只是其指向的堆内存中被填充成0xfeeefeee。如果该指针是一个类的成员变量,并且该类对象是在堆上分配内存的,则该类对象的堆内存被释放后(对于C++类,通常是执行delete操作),类对象中的指针变量就会被赋值为0xfeeefeee。

如果在调试代码过程中,发现指针的值为0xfeeefeee,就说明该指针所在类对象的内存被释放掉了,如果继续使用该指针变量,可能就会出问题了。我们在日常调试时会经常遇到0xfeeefeee这个异常值。

       相关项目问题排查实例,可以参见我之前写的文章:

排查软件关闭时访问了0xfeeefeee内存地址导致内存访问违例的崩溃https://blog.csdn.net/chenlycly/article/details/125267046

1.3、异常值0xdddddddd 

       对于0xdddddddd,是Debug下用来标记堆上已经释放掉的内存,即已经释放的堆内存会被填充成0xdddddddd。 0xfeeefeee也是Debug下用来填充已经释放的堆内存,但0xdddddddd和0xfeeefeee的使用场景应该是有区别的,具体区别我也不太清楚,仅从上面的说明文字中没法区分。

       之前在项目问题中看到的基本都是0xfeeefeee,没见到过0xdddddddd,但前段时间在Debug下调试代码时遇到了,代码中访问了已经释放的内存,内存中都被置为0xdddddddd,这还是第一次遇到0xdddddddd异常值!正是通过0xdddddddd的说明,得知这个0xdddddddd是用来填充已经释放的堆内存,以这个为线索,快速地定位了问题!

我之前为了搞清楚这两个0xdddddddd和0xfeeefeee的区别(在何种场景下会使用),写了很多测试代码,但不幸的是,每次释放后的堆内存中都被填充成了0xfeeefeee。

       相关项目问题排查实例,可以参见我之前写的文章:

访问0xdddddddd内存地址引发软件崩溃的问题排查https://blog.csdn.net/chenlycly/article/details/132631020

2、关于VS 中 debug 和 Release 模式下的变量初始值问题

       大家应该都遇到过,Visual Studio编译出来的程序,在debug下和release下运行效果不一样的情况(表现出不同的现象),可能的原因之一,就是与两个模式下的变量初始化有直接的关系。对于未人为初始化的变量,debug下会将栈内存填充成0xcccccccc,会把堆内存填充成0xcdcdcdcd,即debug下会被自动初始化;但release下变量不会被初始化,变量的值会是随机的,是分配内存时内存中“残留的值”,所以引发了程序在debug和release下的不同表现。

        如果你的程序中的某个变量没被初始化就被访问,有可能出现如下的异常:

1)未初始化的变量用作控制变量时,可能会导致业务流程和代码走向不一致;

2)未初始化的变量用作数组下标时,会导致数组越界,引发程序崩溃;

3)未初始化的C++类指针,可能会导致内存访问违例,引发程序崩溃。

所以,我们要养成好的编码习惯,在声明变量后马上对其初始化,初始化成一个默认值,这是最简单有效的办法,否则项目大了就较难定位问题了。这点对于缺乏开发经验的新人,要特别注意。

可能有人会说,只要控制好现有的代码,不让代码去访问未初始化的变量,就没问题,不一定非要一上来就对变量进行初始化。即便是这样,也是不可取的,因为代码后面可能会交由其他人维护,每个人编码水平是有差异的,你这里可以保证没问题,到别人那边可能就会出问题。文章来源地址https://www.toymoban.com/news/detail-446137.html

到了这里,关于内存中常见异常值的解释(比如0xcccccccc、0xcdcdcdcd和 0xfeeefeee 异常值 )的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 高效处理异常值的算法:One-class SVM模型的自动化方案

    数据清洗和异常值处理在数据分析和机器学习任务中扮演着关键的角色。清洗数据可以提高数据质量,消除噪声和错误,从而确保后续分析和建模的准确性和可靠性。而异常值则可能对数据分析结果产生严重影响,导致误导性的结论和决策。因此,有效的异常值处理方法对于

    2024年02月06日
    浏览(44)
  • 常见通信名词的解释

    在通信接口的介绍中,难免见到全双工/半双工/单工、同步/异步等这些名词。今天就专门来介绍一下这些名词。 数据通信中,数据在线路上的传送方式可以分为单工通信、半双工通信和全双工通信三种。 单工通信:是指消息只能单方向传输的工作方式。例如遥控、遥测(某

    2024年02月06日
    浏览(52)
  • arm 32 常见汇编指令解释

    push: 将一个或多个寄存器的值压入栈中,更新栈指针寄存器。语法示例:push {r1, r2, r3}。 add: 执行加法并将结果存储到目标操作数中。语法示例:add r1, r2, #5,将寄存器r2的值加上5,结果存储到寄存器r1中。 push.w: 将指定的寄存器的值压入栈中,并将栈指针向下调整4个字节。语

    2024年02月06日
    浏览(46)
  • Pandas 常见用法演示及解释

    1. 创建 DataFrame DataFrame 是 Pandas 中的一个基本数据结构,用于以表格形式存储和操作数据。以下是创建 DataFrame 的代码示例: 这里,我们创建了一个包含姓名、年龄和城市的 DataFrame。每个键(\\\'Name\\\', \\\'Age\\\', \\\'City\\\')对应一列,而键的值是一个列表,表示列中的数据。 2. 数据选择和

    2024年01月21日
    浏览(39)
  • 网络安全中常见的网络协议解释

    多播DNS(mDNS)协议用于在不包含本地名称服务器的 小型网络 中将主机名解析为IP地址 传统的 DNS用于将域名转换为 IP 地址,而 mDNS 则是在局域网环境中使用的一种零配置协议。它使用特定的多播地址(例如 IPv4 的 224.0.0.251 和 IPv6 的 ff02::fb),使设备能够向网络发送广播消息

    2024年02月02日
    浏览(58)
  • 人工智能发展历史与常见名词解释

    Artificial Intelligence,也叫 AI,这是一个比较统称的说法,通俗来说就是让机器能像人一样对事物做出反应,该领域的研究包括机器人、图像识别(CV)、自然语言处理(NLP)、数据处理(BI)和专家系统等。 按照人工智能的发展程度,行业一般将其分为三个层次: 计算智能:

    2024年02月10日
    浏览(64)
  • PyTorch中常见损失函数的简单解释和使用

    损失函数,又叫目标函数。在编译神经网络模型必须的两个参数之一。另一个必不可少的就是优化器,我将在后面详解到。 重点 损失函数是指计算机标签值和预测值直接差异的函数。 这里我们会结束几种常见的损失函数的计算方法,pytorch中也是以及定义了很多类型的预定义

    2024年02月09日
    浏览(35)
  • [k8s] 常见yml配置和详细解释

    在 Kubernetes (K8s) 中,常见的 YAML 文件配置包括: 在 Kubernetes 中,服务是一种抽象,用于公开 Pod 或一组 Pod 提供的应用程序或功能。通过服务,其他组件可以无需了解具体 Pod 的 IP 地址和端口而直接与应用程序进行通信。服务可以通过多种方式公开,包括 ClusterIP、NodePort 和

    2024年02月07日
    浏览(36)
  • 吉林大学 计算机网络常见的名词解释

    API (Application Programming Interface)应用程序编程接口 HTTP (Hyper Text Transfer Protocol) 超文本传输协议 CDN (Content Delivery Network)内容分发网络 SMTP (Simple Mail Transfer Protocol)即简单邮件传输协议 POP3 (Post Office Protocol),即第三版的邮局协议,用于电子邮件的接收。本协议主要用

    2024年02月05日
    浏览(50)
  • java异常处理机制(三)常见异常

    Java常见的异常包括但不限于以下几种: 1. NullPointerException(空指针异常):当试图调用实例方法或访问实例变量时,对象引用为 null 时抛出。 2. ArrayIndexOutOfBoundsException(数组越界异常):当访问数组中不存在的元素时抛出。 3. ClassCastException(类转换异常):当试图将对象强

    2024年02月05日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包