连续两次free()同一个指针的报错
来源:互联网 发布:水淀粉挡子弹知乎 编辑:程序博客网 时间:2024/04/27 17:59
程序具有一定规模后,对指针的操作很容易犯错,导致堆破坏。下面主要讲一下用free()释放由malloc()或calloc()申请的空间问题。
先贴一篇论坛比较好的讨论帖: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 0
- 连续两次free()同一个指针的报错
- 两次free()或delete()同一个指针地址会怎么样。
- 连续两次打开同一个文件
- 判断同一个单词是否连续出现了两次
- free 一个指针时【 retval = HeapFree(_crtheap, 0, pBlock);】报错的原因
- 同一个指针居然可以分配两次内存而不出错。
- free报错问题的原因总结
- 指针的free nil
- malloc和free(2)——malloc()申请内存得到指针,指针被改动,用free释放内存报错
- 连续new两次对象的结果比较
- pthread_join 两次同一个线程
- 解决“引入同一个JS文件IE6报错”的问题
- hadoop streaming 同一个命令 不同的表达方式报错
- andfix 多次修改同一个方法报错的解决
- 经典的判断同一台机器同一个程序开启两次
- LoadRunner同一个脚本运行两次结果相差很大的原因
- LoadRunner同一个脚本运行两次结果相差很大的原因
- LoadLibrary加载同一个DLL文件两次, 发现返回的 hModule 是一样的, 是同一个实例
- leetcode Invert Binary Tree
- android图形美化
- 使用malloc动态定义数组
- D
- 递归求阶乘
- 连续两次free()同一个指针的报错
- POJ 2488 A Knight's Journey
- 猜数字游戏
- uva11478(差分约束,spfa求负环)
- 创建一个关于三角形的类
- 堆+贪心 逃亡
- 第三周 项目4(6)谁是小偷
- android设置文字字体
- pollard rho