free函数与内存管理

44 篇文章 0 订阅
new:分配内存+调用构造函数;
delete:释放内存+调用析构函数;
malloc:分配内存;

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操作,否则即有析构函数也是没用的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值