free 一个指针时【 retval = HeapFree(_crtheap, 0, pBlock);】报错的原因

简介:

 

报错的位置

复制代码
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. 在程序运行结束后(系统自动回收堆空间时报错)

没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。








    本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/5278020.html ,如需转载请自行联系原作者
相关文章
|
编解码 Linux 编译器
使用 C++ 方式实现 GBK 到 UTF-8 转码 (win / linux)
使用 C++ 的方式处理在 Windows 平台和 Linux 平台,编码字符集从 GBK 到 UTF-8 转码,C++ 存在多种方式实现
4175 1
|
安全 网络协议 网络安全
【网络连接】ping不通的常见原因+解决方案,如何在只能访问网关时诊断,并修复IP不通的问题
【网络连接】ping不通的常见原因+解决方案,如何在只能访问网关时诊断,并修复IP不通的问题
25026 0
|
安全 Windows
解决虚拟网卡无法连接到 Internet 问题(之一)
电脑中“传入的连接”可能导致虚拟网卡无法上网。解决方法:1. 删除不支持ICS的网络连接;2. 启用再禁用虚拟网卡的ICS功能(可能需重启后问题重现)。为自动重置ICS,可下载并按照指示设置PowerShell脚本`PSInternetConnectionSharing`和`resetics.cmd`,确保处理安全警告并以管理员权限运行。建议直接删除不支持ICS的网络连接以避免问题。
887 2
|
Ubuntu 开发工具 Docker
【Docker】在ubuntu容器内使用apt-get遇到网络连接错误的解决方案
【Docker】在ubuntu容器内使用apt-get遇到网络连接错误的解决方案
|
4天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
296 116
|
19天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
7天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
467 44
Meta SAM3开源:让图像分割,听懂你的话