连续两次free()同一个指针的报错
2016-03-29 20:00
169 查看
程序具有一定规模后,对指针的操作很容易犯错,导致堆破坏。下面主要讲一下用free()释放由malloc()或calloc()申请的空间问题。
先贴一篇论坛比较好的讨论帖:http://bbs.csdn.net/topics/390121909 这篇主要讨论了调用free()主要是释放了什么?
简单的说就是:free()函数释放了指针在堆上指向的空间,这仅是向操作系统表明“这片空间我不要了,你回收吧!”。然而该指针还是指向这片空间,这时若要对这个指针进行读写操作非常危险,容易引发灾难。
好吧,现在进入正题。(以下的分析认为你已经知道上面这些了)
Img是自定义的结构体(不重要),将释放函数写成函数的形式,方便多次调用。
free_gaussImg( img1 );
free_gaussImg( img1 );
连写这两条语句后,运行报了堆破坏的错误。要是中断错误指在free_gaussImg内还好说,要是由于这个问题而指向其他地方,就等着哭吧,别问我是怎么知道的,让我哭会。
还是说重点吧!开始以为free_gaussImg()将指针 img1 赋空了,在单步调试的时候发现 img 被赋空了,然而真正的实参 img1 并没有赋空,赋空的只是形参 img。当这时我才意识到这就是指针传值的特点:img1 所指向的空间确实被释放了,而 img1 还是指向该处,再次调用free_gaussImg函数就报错了。正确的做法应该是这样的:
本人知识水平有限,在实践了发现这个问题,并提供了一种解决办法,若您有更好的方法,可以共享一下,大家相互学习。
先贴一篇论坛比较好的讨论帖:http://bbs.csdn.net/topics/390121909 这篇主要讨论了调用free()主要是释放了什么?
简单的说就是:free()函数释放了指针在堆上指向的空间,这仅是向操作系统表明“这片空间我不要了,你回收吧!”。然而该指针还是指向这片空间,这时若要对这个指针进行读写操作非常危险,容易引发灾难。
好吧,现在进入正题。(以下的分析认为你已经知道上面这些了)
Img是自定义的结构体(不重要),将释放函数写成函数的形式,方便多次调用。
static __inline void free_gaussImg(Img* img) { if( img ) { if( img->imageData ) { free( img->imageData ); img->imageData = NULL; } free( img ); img = NULL; } }开始以为这种方式非常好,不仅释放掉空间,还赋上了NULL。自以为可以规避两次连续释放同一个指针所带来的系统的报错,还用了static和inline,然并卵。
free_gaussImg( img1 );
free_gaussImg( img1 );
连写这两条语句后,运行报了堆破坏的错误。要是中断错误指在free_gaussImg内还好说,要是由于这个问题而指向其他地方,就等着哭吧,别问我是怎么知道的,让我哭会。
还是说重点吧!开始以为free_gaussImg()将指针 img1 赋空了,在单步调试的时候发现 img 被赋空了,然而真正的实参 img1 并没有赋空,赋空的只是形参 img。当这时我才意识到这就是指针传值的特点:img1 所指向的空间确实被释放了,而 img1 还是指向该处,再次调用free_gaussImg函数就报错了。正确的做法应该是这样的:
if( img1 ) { if( img1->imageData ) { free( img1->imageData ); img1->imageData = NULL; } free( img1 ); img1 = NULL; }在要释放img1的地方直接释放赋空,而不能调用函数了。这样不管你释放多少次,都没有问题。
本人知识水平有限,在实践了发现这个问题,并提供了一种解决办法,若您有更好的方法,可以共享一下,大家相互学习。
相关文章推荐
- 网络请求
- 1.4算法入门之车牌号
- 第四次上机实践项目-项目4-长方柱
- java--多线程
- 第五周上机实践项目2(1):游戏中的角色类
- 求n的阶乘
- JSP里比对单选框或复选框的数值而自动打勾
- SQL注入攻击和防御
- atitit.atiLinq v2新特性attilax大总结 q326
- 商务邮件
- 33 继承(五)
- 条件判断语句比较
- 第四周 项目1(2)
- ROS学习(二)server和client的编写总结
- 第5周项目1:三角形类雏形(4)
- 生成唯一id号解决方法
- 项目中 登录注册逻辑判断
- BurpSuite工具应用
- Java基础知识强化之IO流笔记77:NIO之 Selector
- ZooKeeper的部署与运行