一个不小心引发的Heap corruption

2024-01-20 04:20
文章标签 heap 小心 引发 corruption

本文主要是介绍一个不小心引发的Heap corruption,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一个不小心引发的Heap corruption

From: http://www.cppblog.com/kerlw/archive/2007/04/10/21604.aspx

今天写程序的时候碰到一个问题,调试的时候总是报错Heap corruption detected。一直没碰到过这样的问题,所以实在不知道如何下手。后来偶然一次注释掉一个释放语句,就没报错了Heap corruption detected了(但是报memory leak),才发现原来这个释放有问题。我的一个函数调用中,开始的时候分配了一个char数组,结束的时候释放这个数组空间,看起来完全是没有问题的,居然会引发Heap corruption detected。代码大体如下:
 
char* pCmd = new char[len+1];   // len has got value before
memset( pCmd, 0, len+1);
.........
for(int i=0;i<len;i++) {
      ........      //获取一个str内容形如:"1A", "0F"
      sscanf(str, "%02X", &pCmd[i]);
}
.....
delete [] pCmd;

找到问题的所在,再分析代码才发现了这其中一个很隐蔽的问题,就是那句sscanf,由于第二个参数用的是"%02X",那么对它而言,最后一个参数就是一个指向int类型的指针了,而我给的实际是一个char的指针。
如果上面的循环只进行到i<len-2,或者pCmd的size扩大到len+3,都可以避免heap corruption。
后来我干脆用了一个零时的int型变量来完成这个工作。

要分析这个问题,太理论化的我将不上来,应该是sscanf调用的过程中,由于pCmd分配到的空间不足,因此引发了新的分配,pCmd不再是像声明的那样一个len+1大小的char数组,因此直接调用delete [] pCmd就会引发heap corruption了。到底咋回事,也许还要高人来讲讲。

posted on 2007-04-10 17:39  SuperPlayeR 阅读(8524)  评论(3)   编辑  收藏  引用 所属分类:  C/C++

评论

re: 一个不小心引发的Heap corruption 2007-04-11 19:50  Paradoxiology
从VS.Net之后,CRT带的malloc都会在每次分配的内存块的前端和末尾增添一些额外的调试信息,每次free它们的时候都会检测一下,如果改变了就说明内存溢出之类的情况发生了。 
所以说heap corruption的引发是因为使用sscanf的时候覆盖了调试信息,sscanf本身是不会分配内存的。   回复   更多评论 
  

re: 一个不小心引发的Heap corruption 2007-04-11 23:41  nick
to Paradoxiology: 
不是从 vs.net 开始的吧. 至少 vc6 就有了.   回复   更多评论 
  

re: 一个不小心引发的Heap corruption  2011-07-18 16:05  啊啊
应该是VC6 就有了,这个应该是一种基本的内存检测手段   回复   更多评论 

这篇关于一个不小心引发的Heap corruption的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/624770

相关文章

如何删除不小心上传到git远程仓库中的.idea .iml文件

如果在开始的时候不配置,gitignore文件或者文件配置不正确,初始化上传的时候就会有一些不必要的信息上传上去 如果已经存在了一些文件在git远程仓库中,如。idea,.iml文件等。 首先在项目中定义一个  .gitignore文件,简单的实例如下也可以用idea中的gitignore插件 .DS_Storeclasses/*.settings/target/.classpath

一道算法题引发的动态内存管理的思考

在做PKU2762时,需要建邻接表。 于是按部就班写了下面一个插入边到邻接表中的函数: const int VMAX = 1010;typedef struct Graph{int vex;Graph* next;}Graph;Graph ArcGraph[VMAX];void insert(int u, int v){Graph* t = new Graph;Graph*

引发蛀牙、避免蛀牙食物大全

引发蛀牙、避免蛀牙食物大全 引发蛀牙的食物大全: 糖果 糖浆 糖果棒 巧克力 碳酸饮料 果汁 口香糖 蜂蜜 蛋糕 甜点 薯片 脆饼干 果酱 果冻 蜜饯 蜜饯果干 避免蛀牙的食物大全: 高纤维蔬菜 水果 坚果 种子 高钙乳制品 高蛋白质肉类 高蛋白质鱼类 绿茶 水 蔬菜汤 鸡汤 酸奶 酸奶制品 奶酪 红薯 土豆 面包和全麦面包 芝士

捉虫笔记(四)-- 空格引发的悬案

空格引发的悬案 1、描述现象: 在代码中有一段利用rmdir指令删除目录代码,但是有用户反馈一直删除失败,但是有没有看到错误的日志信息,正好有同事能复现,所以今天好好探究一番。 2、思考过程 很好奇的一点就是为什么有的环境就是正常。 首先想到2个问题: ①代码有没有执行。 ②假如执行,有没有错误。 关于这两个问题都有个难点,我该如何下断点: 2.1、分析代码是否执行 删除目录的

“苹果税”引发的苹果与腾讯、字节跳动之间的纷争与博弈

北京时间9月10日凌晨一点的Apple特别活动日渐临近,苹果这次将会带来iPhone16系列新品手机及其他硬件产品的更新,包括iPad、Apple Watch、AirPods等。从特别活动的宣传图和宣传标语“閃亮時刻”来看,Apple Intelligence将会是史上首次推出,无疑将会是iOS 18的重头戏和高光时刻。 不过就在9月2日,一则“微信可能不支持iPhone16”的

【UVa】10755 Garbage Heap 三维前缀和

题目分析:将前缀和应用到三维,求最大子矩阵。为S[x][y][z]数组中每个坐标保存从(0,0,0)到(x,y,z)范围内的子矩阵的元素和,最后用多次区间加减法可以得到需要的子矩阵的元素和,再用类似一维求最大连续和的方法求三维最大连续和。 代码如下: #include <cstdio>#include <cstring>#include <algorithm>using

Navicat导入时由分号引发的诡异问题

最近在将第三方提供的一个sql导入到自己的数据库的时候,(Event部分的脚本)总是提示错误: [Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near

MyEclipse中Jboss启动出现Java heap space解决方案

转 http://cst.is-programmer.com/posts/16109.html 在MyEclipse中启动JBOSS,结果报: java.lang.OutOfMemoryError: Java heap space 异常,用jboss中的run.bat启动,则正常运行,而在MyEclipse中启动就报异常,百度之~~得解: 原因是对于很大的Web工程(公司的这个平台

Build Min Heap Using Array

Build min-heap using Array. 思路1:首先明白heap的底层implementation就是array,从0开始的parent和left,right的关系为, 如果现在的node index为i,那么parent index就是 (i-1)/2;   left  为2*i+1, right为 2*i+2;          ( i-1 ) / 2

由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(一)

概述 从 WWDC 23 开始,苹果推出了全新的数据库框架 SwiftData。它借助于 Swift 语言简洁而富有表现力的特点,抛弃了以往数据库所有的额外配置文件,只靠纯代码描述就可以干脆利索的让数据库的创建和增删改查(CRUD)一气呵成。 在本系列博文中,我们将从一个简单而“诡异”的运行“事故”开始,有理有据的深入探寻一番 SwiftData 中耐人寻味的“那些事儿”。 在本