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

C++调用delete释放char数组时出现heap corruption堆损坏问题咨询

问题根因分析
  • 最直接的堆损坏触发原因:ReadProcessMemory 参数传递错误
    你代码中写的ReadProcessMemory(hprocess, (LPCVOID)(StartAddress), &Buffer, MemBlockSize, nullptr)存在严重错误:Buffer本身就是指向你申请的堆内存的指针,取地址&Buffer后相当于把目标进程的内存内容写到了栈上存储Buffer指针变量的地址空间,直接覆盖了Buffer本身存储的堆地址,后续执行delete[]时释放的不是你最初申请的堆内存,自然触发堆损坏错误。
  • 逻辑错误:ReadProcessMemory返回值判断写反
    ReadProcessMemory执行成功时返回非0值,失败返回0。你当前的判断逻辑是读取成功时进入错误打印分支,完全和预期逻辑相反。
  • 潜在越界问题:特征码匹配逻辑存在数组越界
    你需要匹配的特征码长度为5字节,当前for循环的判断条件是i < MemBlockSize,当i大于等于MemBlockSize - 4时,访问Buffer[i+4]会超出你申请的缓冲区范围,属于堆内存越界访问,同样会破坏堆结构。
  • 附加问题:你当前注释了delete[] Buffer,每遍历一个内存块就会泄漏对应大小的堆内存,长时间运行会导致内存占用异常升高。
修复方案
// 修复点1:修正ReadProcessMemory的参数与返回值判断,增加实际读取字节校验更稳妥
SIZE_T bytesRead = 0;
if (!ReadProcessMemory(hprocess, (LPCVOID)StartAddress, Buffer, MemBlockSize, &bytesRead) || bytesRead != MemBlockSize)
{
    printf("[-] Error Occured - Failed to Read Memory. At Address -- 0x%llx 0x%08X \n", StartAddress, GetLastError());
    delete[] Buffer; // 出错也要先释放内存避免泄漏
    break;
}

// 修复点2:修正循环上限避免数组越界
for (unsigned int i = 0; i < MemBlockSize - 4; i++) {
    // 原有匹配逻辑保持不变
    if (Buffer[i]     == s_crc32values.first) {
    if (Buffer[i + 1] == s_crc32values.skip || Buffer[i + 1] == s_crc32values.skip2) {
    if (Buffer[i + 2] == s_crc32values.third1) {
    if (Buffer[i + 3] == s_crc32values.third2) {
    if (Buffer[i + 4] == s_crc32values.third3) {
    printf("CRC32 Found! at 0x%llx\n", StartAddress + i);
                    }
                }
            }
        }
    }
}

// 修复点3:取消delete[] Buffer的注释,正常释放内存
delete[] Buffer;
优化建议

可以直接用std::vector<char> Buffer(MemBlockSize, 0)代替手动new/delete的数组,自动管理内存,避免忘记释放或者释放出错的问题,使用时直接传Buffer.data()作为ReadProcessMemory的第三个参数即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:36:04