You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何用memset将内存块设为0后显示cd而非0?

问题分析与解决

你看到的cd cd cd cd是调试模式下堆内存被释放后的标记值(VC++编译器常用这个值标记已释放的堆内存块)。问题核心是:你在调用delete[] buffer;释放内存后才去查看这块内存——此时这块内存已经不属于你的程序,调试器会用0xCD填充它,用来提示开发者这块内存已被释放,避免误访问。

修正后的代码

把内存释放操作移到程序暂停之后,确保调试查看时内存还处于已分配状态:

#include <iostream>
#include <cstring>  // 必须包含memset的头文件,否则可能触发未定义行为

int main()
{
    char* buffer = new char[8];
    memset(buffer, 0, 8);

    // 此时buffer的内存未被释放,调试查看会显示00 00 00 00 00 00 00 00
    std::cin.get();  // 程序暂停,方便调试

    delete[] buffer;  // 最后释放内存
    return 0;
}

额外注意点

  • 调试堆内存时,一定要在内存分配后、释放前查看,否则看到的是调试器的标记值,不是你程序写入的内容。
  • memset属于C标准库函数,必须包含<cstring>头文件,原代码缺少该头文件,虽然部分编译器会隐式包含,但严格来说属于未定义行为,务必补上。
  • 不同调试环境的内存标记值可能不同:比如VC++用0xCD标记已释放堆内存,0xCC标记未初始化的栈内存,这些都是调试器用来帮助开发者排查内存问题的手段。

内容的提问来源于stack exchange,提问作者masafood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 13:15:56