free 一个指针时【 retval = HeapFree(_crtheap, 0, pBlock);】报错的原因-阿里云开发者社区

开发者社区> 橘子红了呐> 正文

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,如需转载请自行联系原作者



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
8475 0
redis redis-2.6.17 安装失败 原因分析
  redis 安装 redis-2.6.17   redis 集群 安装 http://knight-black-bob.iteye.com/blog/2343192       zmalloc.
753 0
Crystal Reports拉报表报错:Error detected by database DLL
问题描述: 最近在使用Crystal Reports打印报表时,提示错误信息:“Error detected by database DLL.” 如下图: 经查找,是因为数据库名称不同造成的; 用户的测试环境使用的库名称为ClaimsReport; 我们本地使用的库名称为Claims;   解决方案: 打开报表工具Crystal Reports 8.5,进入Database->Set Location界面,如下图:   把红框中数据库名称去掉,然后点击按钮【Done】即可。
1069 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
10276 0
DNN安装报错-The stored procedure 'dbo.GetPortalAliasByPortalID' doesn't exist.如何解决
因为出错代码比较长,就放在后面了。 出现"The stored procedure 'dbo.GetPortalAliasByPortalID' doesn't exist."报错的情况很多 只要是安装过程中出现异常终止,然后我们又试图访问没有安装好的网站(因为是装了一半终止的,所以DNN不会再触发安装的过程); 或者其它的设置导致DNN不能正常运行就有可能出现这个报错。
702 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
12148 0
3404
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载