那些年满天飞的bug(1)
2015-08-14 14:58
330 查看
环境:Ubuntu+Linux+gcc
错误:*** glibc detected *** ./server3: free(): invalid pointer: 0x00007f0994a99010 ***
错误原因分析:将malloc()分配的指针被修改以后传给了free()
网络相关资源:点击打开链接 点击打开链接
引用:《C和指针》中关于这个错误有较为详细的叙述,摘取如下:
警告:
当你使用free时,可能会出现各种不同的错误。传递给free的指针必须是一个从malloc、calloc或realloc函数返回的指针。传递给free函数一个指针,让它释放一块并非动态分配的内存可能导致程序立即中止或在晚些时候终止。试图释放一块动态内存的一部分也有可能引起类似的问题,像下面这样:
总结:使用动态内存分配时,稍有不慎出现的问题非常多。而且有些问题甚至是编译器不会出现错误、警告的。所以要严格的遵照规则来办事,不要去涉及那些“阴暗”的角落,不是你的内存你别用。使用malloc、free的正确的模式应该如下:
错误:*** glibc detected *** ./server3: free(): invalid pointer: 0x00007f0994a99010 ***
错误原因分析:将malloc()分配的指针被修改以后传给了free()
网络相关资源:点击打开链接 点击打开链接
引用:《C和指针》中关于这个错误有较为详细的叙述,摘取如下:
警告:
当你使用free时,可能会出现各种不同的错误。传递给free的指针必须是一个从malloc、calloc或realloc函数返回的指针。传递给free函数一个指针,让它释放一块并非动态分配的内存可能导致程序立即中止或在晚些时候终止。试图释放一块动态内存的一部分也有可能引起类似的问题,像下面这样:
/* **Get 10 integers */ pi=malloc(10*sizeof(int)); .... /* **Free only the last 5 integers;keep th**e first 5 */ free(pi+5);
总结:使用动态内存分配时,稍有不慎出现的问题非常多。而且有些问题甚至是编译器不会出现错误、警告的。所以要严格的遵照规则来办事,不要去涉及那些“阴暗”的角落,不是你的内存你别用。使用malloc、free的正确的模式应该如下:
/*pi是一个指针*/ pi=malloc(10*sizeof(int)); if(NULL==pi)/*尽管分配内存失败这种情况非常少见,但还是要预防*/ { printf("内存申请失败!\n"); exit(1); } ...... /*使用完后记得释放,不然会造成内存泄露,这样子会将一点点的榨干可用内存。*/ free(pi);/*记得不要试图释放并非内存分配的内存或者释放一块动态分配的内存的一部分*/ pi=NULL;/*防止动态内存指针被释放后继续被使用*/
相关文章推荐
- Android-ViewPager+Fragment数据更新问题
- 多线程调用DLL(面向对象)
- 眼疲劳症如何自我检测
- poj2528线段树+hash+二分
- Humble Numbers
- [LeetCode] Word Ladder
- 自动执行任务
- Codeforces Gym 100379J Move the (p, q)-knight to the corner! 组合数学DP, Lucas定理
- elasticsearch 大数据优化
- SDUT-2498-AOE网上的关键路径
- JS获取当前页面的URL等信息
- c# asp .net 动态创建sql数据库表
- NSQ:分布式的实时消息平台
- android 暂停和继续第三方应用的语音播放
- SQL Server 2008 TCP/IP 连接失败
- Eclipse集成tomcat
- 深入理解java异常机制
- PowerShell-第3章 变量与对象
- UIAutomator教程
- javaweb图片上传 tomcat重新部署 图片消失