free指针时遭遇_CrtIsValidHeapPointer (转贴)

 

malloc和free在教材里不知讲了多少,今天实际用到一处,就出问题了。

案发现场是我用VC++在WINXP下编程,先看这一段代码
{
    BYTE    *pBuffer;
    pBuffer = (BYTE *)malloc(64);
    pBuffer = pBuffer + 32;
    free(pBuffer);
    pBuffer = NULL;
}  //第一段
先声明一个指针,然后分配64字节给它。操作指针向后移动32字节,最后把这个指针free掉并设为NULL。这样虽然操作时的数据还留在内存区域里,但已经没有指针指向该区域,数据可以被后面的程序覆盖了。看起来没错吧?恩恩好象是没错, 抓了三个同事来问,全票通过.  但在实际上呢, 运行时会跳出这个警告:



而如果把代码改成
{
    BYTE    *pBuffer;
    pBuffer = (BYTE *)malloc(64);
    pBuffer = pBuffer + 32;
    pBuffer = pBuffer -32;
    free(pBuffer);
    pBuffer = NULL;
}  //第二段代码
就没错了。李博士的解释是:malloc的时候系统创建了一个链表之类的东西,里面包含了起始地址和长度;而free的时候根据参数中的指针进行判断,如果该指针符合链表中某一节的起始地址,那么就把这一节free掉,如果去free一个不在链表中的地址,就出错啦。

比较好的处理方式是这样
{
    BYTE    *pBuffer;
    BYTE    *pBytePtr;
    pBuffer = (BYTE *)malloc(64);
    pBytePtr = pBuffer;
    pBytePtr = pBytePtr + 32;
    free(pBuffer);
    pBuffer = NULL;
    pBytePtr = NULL;
}  //第三段代码

即保留malloc时候的初始地址,然后赋给另外一个临时指针。操作时使用后者。free的时候把保留的起始指针free掉,而临时指针只是个变量,置空就可以了。

文章到这里似乎就应该写完了,不过由于johnathan的帮忙, 突然有了下文。

注意警告框中的_CrtIsValidHeapPointer,在MSDN上查到这个函数的说明为:

Verifies that a specified pointer is in the local heap (debug version only).

int _CrtIsValidHeapPointer(const void *userData);

Parameter:
userData  Pointer to the beginning of an allocated memory block.

Return Value:
_CrtIsValidHeapPointer returns TRUE if the specified pointer is in the local heap. Otherwise, the function returns FALSE.

也就是说仅在debug版本中检查free参数是否为the beginning of an allocated memroy block.

那么就编译一个release版本,果然,运行通过, 没弹出什么警告或错误。但运行通过不等于正常无误,  博士认为这就是无声无息导致内存泄露的罪魁祸首. 即使release版里面也应该free起始地址.

那么结论就是:free掉非malloc起始地址的指针,在debug版本中会出错警告,而在release版本中不会弹出警告但仍然是有错的。所以,还是推荐使用第三段代码的用法

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值