博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
free 一个指针时【 retval = HeapFree(_crtheap, 0, pBlock);】报错的原因
阅读量:5308 次
发布时间:2019-06-14

本文共 1163 字,大约阅读时间需要 3 分钟。

 

报错的位置

void __cdecl _free_base (void * pBlock){        int retval = 0;        if (pBlock == NULL)            return;        RTCCALLBACK(_RTC_Free_hook, (pBlock, 0));        retval = HeapFree(_crtheap, 0, pBlock);//最后一个箭头指到这儿,蛋疼!!!        if (retval == 0)        {            errno = _get_errno_from_oserr(GetLastError());        }}

 

解决方案:

方案1

在运行结束后报错,基本都是内存释放的问题!

释放了一个指针,这个指针所指的内存,不是用malloc等内存管理函数分配的内存。

查看一下那个指针是啥东西。
是否已经施行过加减运算,或者干脆就是随便拿过来的一个数值,
或者一个不用释放的指针(指向局部变量的指针,指向全局变量的指针),
甚至是野指针。

方案2

C,C++ 兼容的分配释放堆内存的函数:

malloc,realloc 
free 
凡是malloc 分配成功的内存,一定要用free释放,这个只要求,内存地址不变就行,分配的指针的值是多少,释放是就必须还是多少。
C++专用:
由于C++分配和释放内存的运算符new delete会分别调用构造函数,析构函数;
所以要求必须配对使用,并且 指针类型和指针的值,delete 的必须和 new的相同,不然就“有可能”不争取

分配单个对象用 new, delete

class A{....}; A *pa=new A;//这里使用的是new 运算符!!......          //这些代码,不可以改动pa的值delete pa;    //使用的是delete 运算符!!改动后这个释放就错了!

分配对象数组用 new[],delete[];例如

class A{....}; A *pa=new A[10];//这里使用的是new[]运算符!!......          //这些代码,不可以改动pa的值delete []pa;    //使用的是delete[]运算符!!改动后这个释放就错了!

ew分配的用free释放 是错误的,同样,malloc 分配的用delete释放也是错误的!

这里指的是,这样做逻辑上是错误的;
非常可能会出错,并不是说一定会出错;
但是不养成配对使用的习惯,很容易出错!!!!

 

 

 

参考文章

1.

转载于:https://www.cnblogs.com/arxive/p/5278020.html

你可能感兴趣的文章
Drawable学习之----LevelListDrawable
查看>>
简单介绍一些HTML代码(字幕、音频和视频)
查看>>
快递行业呼叫中心解决方案
查看>>
《javascript dom编程艺术》笔记(一)——优雅降级、向后兼容、多个函数绑定onload函数...
查看>>
IIS日志详解--logfiles
查看>>
bind cname
查看>>
python手记(7)------字典dict基础
查看>>
关于齐次坐标的理解
查看>>
mptcp 主机无法多IP直连同一路由器
查看>>
37.数字在排序数组中出现的次数
查看>>
人,绩效和职业道德
查看>>
[CSS3] Understand CSS Selector Specificity
查看>>
[D3] 7. Quantitative Scales
查看>>
神奇的python系列8:函数(一)
查看>>
BZOJ1965: [Ahoi2005]SHUFFLE 洗牌(exgcd 找规律)
查看>>
P3376 【模板】网络最大流
查看>>
20180908 2018-2019-2 《密码与安全新技术专题》第7周作业
查看>>
AliCTF 2015-题目解析之代码血案
查看>>
Spring如何解析XML文件——Spring源码之XML初解析
查看>>
单调队列模板浅谈
查看>>