程序具有一定规模后,对指针的操作很容易犯错,导致堆破坏。下面主要讲一下用free()释放由malloc()或calloc()申请的空间问题。
先贴一篇论坛比较好的讨论帖:http://bbs.youkuaiyun.com/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 );