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 malloc, calloc 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 plaincopy
  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 plaincopy
  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 plaincopy
  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了之后还用那个指针的话,就有可能管家已经将这些水桶给了其他人装饮料的了,你却往里面撒了泡尿。好的管家可能会对你的行为表示强烈的不满, 杀了你(非法操作)--这是最好的结果,你知道自己错了(有错就改嘛)。一些不好的管家可能忙不过来,有时候抓到你作坏事就惩罚你,有时候却不知道去那里 了--这是你的恶梦,不知道什么时候、怎么回事情自己就死了。不管怎么样,这种情况下很有可能有人要喝尿--不知道是你的老板还是你的客户了.^_^。   
所以啊,好市民当然是还了给管家的东西就不要再占着啦,.^_^。

free函数用法小结相关推荐

  1. php常用操作数组函数,PHP常见数组函数用法小结

    本文实例讲述了PHP常见数组函数用法.分享给大家供大家参考,具体如下: 1.array array_merge(array $array1 [, array  $array2 [, $array]]) ...

  2. strstr函数用法小结

    strstr 函数原型: char * strstr(char * str1,char * str2); 功能就是找出在字符串str1中第一次出项字符串str2的位置(也就是说字符串sr1中要包含有字 ...

  3. convert函数用法小结

    1.遇见一个应用,需要按照每天进行数据统计,比如里程,油耗量,但是数据库里面存储的时间太精细.在sqlserver下面通过下面的方法解决 convert(varchar(10), 时间字段, 120) ...

  4. convert函数用法小结---转载

    1.遇见一个应用,需要按照每天进行数据统计,比如里程,油耗量,但是数据库里面存储的时间太精细.在sqlserver下面通过下面的方法解决 convert(varchar(10), 时间字段, 120) ...

  5. sqlserver CONVERT()函数用法小结

    CONVERT的使用方法: 格式: CONVERT(data_type,expression[,style]) 说明: 此样式一般在时间类型(datetime,smalldatetime)与字符串类型 ...

  6. Java String.indexOf() 函数用法小结

    1. indexOf的参数是 String,  startIndex: Number; indexOf的返回值为int, 2. Function indexOf 包含如下几个格式: 1). Strng ...

  7. JAVA中indexOf函数用法

    int indexOf(int ch,int fromIndex)函数:就是字符ch在字串fromindex位后出现的第一个位置.没有找到返加-1 eg:String str="a2dfcf ...

  8. php strcmp函数用法,php字符串比较函数用法小结(strcmp,strcasecmp,strnatcmp及strnatcasecmp)...

    本文实例分析了php字符串比较函数用法.分享给大家供大家参考,具体如下: 直接比较字符串是否完全一致,可以使用"=="来进行,但是有时候可能需要进行更加复杂的字符串比较,如部分匹配 ...

  9. C++ :: 的用法小结

    原文:http://blog.csdn.net/whz_zb/article/details/6843369 :: 的用法小结: 用于将类内声明的静态数据成员在类外初始化: 用于将类内声明的函数成员在 ...

最新文章

  1. python-环境准备python,ipython
  2. centos下新建超级用户及sudoers权限问题
  3. 注册表编辑器厘米爱你找不到mysql,win7系统中安装mysql后找不到服务或出现找不到指定文件的解决方法...
  4. 使用Java 8.0进行类型安全的依赖项注入
  5. Win11如何将游戏隐藏 Win11游戏隐藏的方法
  6. MAGENTO与性能优化
  7. Python入门教程100天:Day09-面向对象进阶
  8. 写代码常用英文及缩写
  9. 解读汽车机械工作原理GIF图 懂得三个算你牛!
  10. 对于 Latex CJK 的一些解释
  11. 社交电商“百花齐放”,光鲜背后是大战将起
  12. 欧拉函数与积性函数(互质数)
  13. GEE开发之NDVI和EVI数据集
  14. CentOS 7 YUM安装MariaDB 10.1
  15. GSL科学计算库——计算高斯-勒让德积分
  16. 基于硬件的消息队列中间件 Solace 简介之二
  17. 小案例:实现http://www.alloyteam.com/page/0/移动端效果,博客文章列表和文章详情页面
  18. 复现 Oriented R-CNN RTX3080ti
  19. 网上购车平台上私户,不一样的上私户购车体验
  20. c语言菜单 键盘,三、Windows键盘快捷键—处理菜单项

热门文章

  1. 微信是移动端的主要力量
  2. css实现图片放大效果(鼠标悬浮)
  3. 使用Python调整图像大小
  4. 巧用JavaScript定时器3秒自动关闭广告
  5. 携程机票 Android Jetpack 与 Kotlin Coroutines 实践 | 开发者说·DTalk
  6. 微信缓存JS文件问题
  7. 音频降噪算法 java_音频处理之去噪算法---基于pcm和g711的音频16000hz、8bit去噪声算法...
  8. 苹果7和8的区别_★苹果cms常见问题有哪些?100个常见问题的解决方法
  9. 由free命令引发的buff/cache思考
  10. idea代码补全修改,常用快捷键