http://blog.csdn.net/kome2000/article/details/6570259
1.如何释放内存
很简单free();就ok啦!
C语言中,malloc,realloc,calloc,strdup等等都是动态从堆里面分配的内存,他不会自动释放。在这里需要记录分配的地址,以便以后释放。如果不进行释放,会造成内存泄漏。在堆内存申请的内存是需要程序员管理的,系统不会主动回收,可以通过free()函数回收。通常的商业代码都有很多指针,或者指针的指针,结构体里包含指针类型的成员,那么这些指针该如何管理,才不至于出错呢?
例如 Role *pRole = (Role *)malloc( sizeof(Role) );
释放指针
free( pRole );
pRole = NULL;
释放指针后,将指针指回0点,如果你觉得每次都要写2行代码太麻烦了,可以定一个宏
如果行用一个函数来释放并且达到同样的目的该如何写呢?
这么写是不行的,因为指针p是通过copy方式将实参的值copy过来,
free( p ); 没问题,可以把指针p所指的内存释放,但取无法把指针指向NULL,这是因为形参的地址和实参的地址是不同的!
这样修改就可以了,但这要求实参数是一个指针的地址
使用的时候要这么用
freePointer( (void *)(&pRole) );
这样用着依然不爽,强制类型转换有些编译器是必须的,比如我用的,
基本不是,取指针地址还是必须的!总之给人不直观,不清爽的感觉,
如果换成
FREE( pRole );
就好多了!
1.1如果释放一个带有指针的结构体指针
创建角色对象,我想通过一个方法
那么创建的时候确实可以得到一个角色的指针
Role *pRole =creatRole( "hero", 0 );
释放的时候如果想达到调用
destroyRole(pRole );
后,pRole 指向NULL,该如何做呢?
通过freePointer()方法给我们的教训可以知道,
其中的role = NULL;是不能把实参pRole 指向NULL的!
如果我们向前面提到那样使用宏,或者获取指针地址的形式似乎可以解决,但其实没必要那么麻烦,通常的做法是手动指向NULL
destroyRole(pRole );
pRole = NULL;
为什么要有pRole = NULL;这句呢?因为最上层的结构体对象通常都是需要程序知道是否
为空,或者非空,另外指回原点,也对调试有好处,单独free()对象,在调试的时候是看不出来的!
另外还要提到一点
这个方法是绝对不可取的,因为role是函数内部的临时变量,在函数结束的时候会被系统回收的,随意&role这个地方的数据将被系统重新使用。
在C语言编程中并不是所有指针都需要指回NULL的,如果你愿意都指回NULL更好,但至少应该把一组指针的源头指回NULL,这才能防止程序出错,另外就是把源头指回NULL之前要确保该指针下面的全部指针都已经被回收了!否则就内存泄漏了!