free函数用法小结

FROM MSDN && 百科】

原型:  void free(void *ptr);

#include<stdlib.h>或#include <malloc.h>

Deallocate space in memory

释放ptr指向的存储空间。被释放的空间通常被送入可用存储区池,以后可在调用malloc、realloc以及realloc函数来再分配。

注意:连续两次使用free函数,肯定会发生错误。malloc的次数要和free的次数相等。


A block of memory previously allocated using a call to malloccalloc or realloc is deallocated, making it available again for further allocations.

If ptr does not point to a block of memory allocated with the above functions, the behavior is undefined.
If ptr is a null pointer, the function does nothing

Notice that this function does not change the value of ptr itself, hence it still points to the same (now invalid) location


DEMO:

[cpp]  view plain  copy
  1. //#define  FIRST_DEMO  
  2. #define  SECOND_DEMO  
  3. #ifdef FIRST_DEMO  
  4. #include <stdio.h>  
  5. #include <stdlib.h>  
  6. #include <conio.h>  
  7. int main(void)  
  8. {  
  9.     int *buffer1,*buffer2,*buffer3;  
  10.     buffer1=(int *)malloc(100*sizeof(int));  
  11.     buffer2=(int *)calloc(100,sizeof(int));  
  12.     buffer3=(int *)realloc(buffer2,500*sizeof(int));  
  13.     free(buffer1);  
  14.     free(buffer3);  
  15.     getch();  
  16.     return 0;  
  17. }  
  18. #elif defined SECOND_DEMO  
  19. #include <stdio.h>  
  20. #include <stdlib.h>  
  21. #include <conio.h>  
  22. int main(void)  
  23. {  
  24.     char *str;  
  25.     /*allocate memory for string*/  
  26.     str=(char *)malloc(10);  
  27.     if (str==NULL)  
  28.     {  
  29.         perror("malloc");   
  30.         abort();  
  31.     }  
  32.     else  
  33.     {  
  34.         /*copy "hello" to string*/  
  35.         strcpy(str,"hello");  
  36.         /*display string*/  
  37.         printf("String is %s\n",str);  
  38.         /*free memory*/  
  39.         free(str);  
  40.     }  
  41.     getch();  
  42.     return 0;  
  43. }  
  44. #endif  

DEMO:perror

perror( ) 用来将上一个函数发生错误的原因输出到标准设备(stderr)。参数 s 所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量errno 的值来决定要输出的字符串。

[cpp]  view plain  copy
  1. #include <stdio.h>  
  2. #include <stdlib.h>   //perror包含在此文件中  
  3. #include <conio.h>  
  4. int main(void)  
  5. {  
  6.     FILE *fp;  
  7.     fp=fopen("abc","r+");  
  8.     if (NULL == fp)  
  9.     {  
  10.         perror("abc");  
  11.     }  
  12.     getch();  
  13.     return 0;  
  14. }  

output:

abc: No such file or directory


DEMO:

[cpp]  view plain  copy
  1. #include <stdio.h>  
  2. #include <conio.h>  
  3. #include <stdlib.h>  
  4. #include <string.h>  
  5. int main(void)  
  6. {  
  7.     char *ptr;  
  8.     ptr=(char *)malloc(100);  
  9.     strcpy(ptr,"Hello");  
  10.     free(ptr);    //<span style="font-family: arial, 宋体, sans-serif; font-size: 13.63636302947998px; line-height: 24px; text-indent: 30px;"> ptr 所指的内存被释放,但是ptr所指的地址仍然不变,原来的内存变为“垃圾”内存(不可用内存)</span>  
  11. #if 1  
  12.     if (ptr!=NULL)    /*<span style="font-family: arial, 宋体, sans-serif; font-size: 13.63636302947998px; line-height: 24px; text-indent: 30px;"> 没有起到防错作用</span>*/  
  13.     {  
  14.         strcpy(ptr," world");  
  15.         printf("%s\n",ptr);  
  16.     }  
  17. #endif  
  18.     getch();  
  19.     return 0;  
  20. }  

【FROM: http://blog.csdn.net/onestep365/article/details/1897626】

free(str)后指针仍然指向原来的堆地址,即你仍然可以继续使用,但很危险,因为操作系统已经认为这块内存可以使用,他会毫不考虑的将他分配给其他程序,于是你下次使用的时候可能就已经被别的程序改掉了,这种情况就叫“指针”,所以最好free()了以后再置空
str = NULL;
即本程序已经放弃再使用他。

何谓“指针”,在这里补充一下。

野指针是指程序员或操作者不能控制的指针。野指针不是NULL指针,而是指向“垃圾”的指针。

造成“野指针”的原因主要有

1.指针变量没有初始化任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。在初始化的时候要么指向合法的指针,要么指向NULL。

2.指针变量被free或delete之后,没有设置为NULL。它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。上文DEMO则是这种情况。

3.指针操作超越了变量的作用范围。  注意其生命周期。


【下面是摘自论坛里面的形象比喻,加深理解。】
CRT的内存管理模块是一个管家。   
你的程序(简称“你”)是一个客人。   
管家有很对水桶,可以用来装水的。   
malloc的意思就是“管家,我要XX个水桶”。   
管家首先看一下有没有足够的水桶给你,如果没有,那么告诉你不行。如果够,那么登记这些水桶已经被使用了,然后告诉你“拿去用吧”。   
free的意思就是说:“管家我用完了,还你!”。   
至于你是不是先把水倒干净才给管家,那么是自己的事情了。--是不是清零。   

管家也不会将你归还的水桶倒倒干清(他有那么多水桶,每个归还都倒干净岂不累死了)。反正其他用的时候自己会处理的啦。   
free之后将指针清零只是提醒自己,这些水桶已经不是我的了,不要再完里面放水了,^_^   
如果free了之后还用那个指针的话,就有可能管家已经将这些水桶给了其他人装饮料的了,你却往里面撒了泡尿。好的管家可能会对你的行为表示强烈的不满, 杀了你(非法操作)--这是最好的结果,你知道自己错了(有错就改嘛)。一些不好的管家可能忙不过来,有时候抓到你作坏事就惩罚你,有时候却不知道去那里 了--这是你的恶梦,不知道什么时候、怎么回事情自己就死了。不管怎么样,这种情况下很有可能有人要喝尿--不知道是你的老板还是你的客户了.^_^。   
所以啊,好市民当然是还了给管家的东西就不要再占着啦,.^_^。

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
malloc和free是C语言中用于动态内存分配和释放的函数。 malloc函数用于在堆上分配一块指定大小的内存空间。它的原型定义在stdlib.h头文件中: void* malloc(size_t size); malloc函数接受一个参数size,表示需要分配的内存大小(单位是字节)。它返回一个void类型的指针,指向分配的内存块的起始地址。如果分配失败,malloc函数返回NULL。 下面是一个使用malloc函数动态分配内存的示例: #include <stdio.h> #include <stdlib.h> int main() { int *ptr; int n = 5; ptr = (int*) malloc(n * sizeof(int)); if(ptr == NULL) { printf("内存分配失败\n"); return 1; } for(int i = 0; i < n; i++) { ptr[i] = i + 1; } for(int i = 0; i < n; i++) { printf("%d ", ptr[i]); } free(ptr); return 0; } 在上面的示例中,我们使用malloc函数动态分配了一个能容纳5个int类型数据的内存块。然后,我们使用指针ptr来操作这个内存块。最后,使用free函数释放了这个内存块,以便将其返回给系统。 free函数用于释放通过malloc函数分配的内存空间。它的原型定义在stdlib.h头文件中: void free(void* ptr); free函数接受一个参数ptr,表示要释放的内存块的起始地址。调用free函数后,系统将回收这块内存空间,可以重新被其他程序使用。 需要注意的是,调用free函数后,释放的内存空间不再属于我们的程序,访问已释放的内存将导致未定义的行为,甚至可能引发程序崩溃。因此,使用free函数后,建议将指针ptr设置为NULL,以避免误用。 总结: - malloc函数用于动态分配内存空间,返回指向分配内存的指针。 - free函数用于释放动态分配的内存空间,将其返回给系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值