free:释放内存;
// free函数在MSDN中的原型
void free(void * memblock);
Function | Required Header | Compatibility |
free | <stdlib.h>, <malloc.h> | ANSI, Win 95, Win NT |
Return Value
None
Parameter
memblock
Previously allocated memory block to be freed
free函数释放一块由指针memblock指向的内存区域,即,将这块内存区域还给操作系统,使其重新成为操作系统可利用的内存资源,这就是为什么我们常说:“如果不使用free释放malloc分配在堆中的内存会造成内存泄露,内存泄露将造成操作系统的内存资源逐步减少”。
注意:是操作系统的内存资源,而不是实际的物理内存,实际的物理内存不会减少,Windows为每个程序提供4G的内存寻址空间,这只是个寻址空间,并不是说每个程序分配4G内存,这4G内存中,前2G为系统空间,后2G为用户空间,因此用户代码部分实际可用寻址空间只有2G,如果你总是malloc,而从不free,则会造成操作系统分配给你的内存越来越多,尽管你已经不用了,但是只要你的程序还在运行,你将越占越多,直至你的程序结束,操作系统才会回收那些内存资源,重新分配给其他程序。
例如:
char * p = (char *)malloc(sizeof(char) * 10);
free(p);
这样的结果是:指针p指向的内存空间将被操作系统回收重新成为可分配资源,其内容将迅速被其他数据覆盖,而此时在函数栈中分配的指针p的值却没有改变,见P152,仍然指向这块内存区域,因此,此时最好不要再使用p来向这块内存区域写入数据,并且,一般在free后,这个指针变成了一个悬垂指针(dangling pointer),术语见《C++ Primer 第4版》P162,索引条目188,悬垂指针是指向曾经存在的对象的指针,但该对象已经不存在了,悬垂指针容易导致程序错误,而且这种错误很难检测出来,因此,在P152中建议一旦使用delete或者free删除了指针所指向的对象,应立即将指针置为0,这样就非常清楚地表明指针不在指向任何对象。
经常会造成内存泄露的一种情况是:指针p所指向的内存区域中有指针q,指针q所指向的内存区域将得不到释放,从而造成内存泄露。
free只能释放参数指针所指向的内存空间,但是对于参数指针所指向的内存空间中的指针所指向的内存空间则无法释放,如果free参数指针指向结构体实例或类对象,则如果结构体或类对象有析构函数,会造成内存泄露,必须使用delete来释放;而如果结构体或类对象中没有析构函数,则无论使用free还是delete都会造成内存泄露。珍贵做法是,对于new分配的自由存储区中的结构体或类对象,尽量提供析构函数,然后使用delete来释放内存,上述情形大多针对结构体而言,类对象一般会有析构函数,而结构体则不然,且析构函数必须进行类内指针的delete操作和free操作,否则即有析构函数也是没用的。