VC 调试版CRT对内存填充⼀些特定tag数据的应用

Visual C++ 调试版运⾏时库(CRT)在内存管理和初始化⽅⾯添加了⼀

些特殊的⾏为,以帮助开发者检测和调试内存相关的问题。这些⾏为包
括在堆内存和栈内存中填充特定的标记( tag )数据。以下是详细的说明
和这些标记数据的⽤途:

堆内存

1. 初始化分配的堆内存
标记 0expectException (0xCD)
⽤途 :当调试版 CRT 分配堆内存时,会将新分配的内存填充
0xCD 。这个标记有助于检测在使⽤未初始化内存时的问
题。如果在调试运⾏时看到 0xCD ,可能表示你正在使⽤未
初始化的内存。
2. 释放后的堆内存
标记 0xFEEEFEEF
⽤途 :当调试版 CRT 释放堆内存时,会将已释放的内存填充
0xFEEEFEEF 。这个标记有助于检测对已释放内存的访
问。如果在调试运⾏时看到 0xFEEEFEEF ,可能表示你正在
访问已释放的内存。
3. 堆内存边界
标记 0 broadcasters (0xFD)
⽤途 :在分配的堆内存的前后会添加⼀些额外的填充字节,
这些字节会被填充为 0xFD 。这些边界填充字节有助于检测
堆溢出或⽋载问题。如果在调试运⾏时看到 0xFD ,可能表
示你正在写⼊或读取超过分配的堆内存边界。

栈内存

1. 未初始化的栈内存
标记 0xCC
⽤途 :在函数调⽤时,未初始化的栈内存通常会被填充为 0xCC 。这个标记有助于检测在使⽤未初始化的局部变量时的
问题。如果在调试运⾏时看到 0xCC ,可能表示你正在使⽤
未初始化的栈内存。
2. 释放后的栈内存
标记 0xCCCCCCCC
⽤途 :当函数返回时,调试版 CRT 会将栈内存填充为
0xCCCCCCCC 。这个标记有助于检测对已释放栈内存的访
问。如果在调试运⾏时看到 0xCCCCCCCC ,可能表示你正
在访问已返回的函数的栈内存。
3. 栈内存边界
标记 0xCCCCCCCC
⽤途 :在栈帧的边界也会添加⼀些额外的填充字节,这些字
节会被填充为 0xCCCCCCCC 。这些边界填充字节有助于检
测栈溢出问题。如果在调试运⾏时看到 0xCCCCCCCC ,可
能表示你正在写⼊或读取超过栈帧边界。
其他调试信息
1. 内存泄漏检测
调试版 CRT 会记录所有分配的堆内存块,并在程序结束时检
查这些内存块是否已被释放。如果检测到内存泄漏,会输出
相关信息,包括泄漏的内存地址、⼤⼩和分配时的调⽤堆
栈。
2. 内存访问验证
使⽤ _CrtCheckMemory 函数可以验证当前堆的完整性。如果
堆被破坏(例如,写⼊了已释放的内存或超出分配的内存边
界),该函数会返回 FALSE ,并输出错误信息。
示例代码
以下是⼀个简单的示例,展示了如何在调试版 CRT 中使⽤这些标记数据
来检测内存问题:
#include <iostream>#include <crtdbg.h>
int main() {
// 设置内存泄漏检测
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF |
_CRTDBG_LEAK_CHECK_DF);
// 分配堆内存
char* buffer = new char[100];
// 模拟使⽤未初始化的内存
std::cout << buffer[0] << std::endl; // 通常会输出 0xCD
// 释放堆内存
delete[] buffer;
// 模拟使⽤已释放的内存
buffer[0] = 'A'; // 通常会触发访问违反或异常
// 检查堆的完整性
_CrtCheckMemory();
return 0;
}

总结:

调试版 CRT 通过在堆内存和栈内存中填充特定的标记数据,帮助开发者
检测和调试各种内存相关的问题。这些标记数据可以⽤于检测未初始化
内存的使⽤、已释放内存的访问、堆和栈的溢出问题,以及内存泄漏。
通过理解和使⽤这些标记数据,开发者可以更有效地进⾏内存管理,提
⾼程序的稳定性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值