免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: zqh1630
打印 上一主题 下一主题

[C] 关于while(1)中malloc和free的使用? [复制链接]

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
11 [报告]
发表于 2013-04-18 16:04 |只看该作者
zqh1630 发表于 2013-04-18 12:58
是不是在while(1)中不能用malloc和free, 我就是在

while(1){

建议你把malloc的返回值和free的参数打印出来,对比一下看看

论坛徽章:
0
12 [报告]
发表于 2013-04-18 16:14 |只看该作者
回复 11# cjaizss


    我试试!!!
谢谢~

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
13 [报告]
发表于 2013-04-18 16:14 |只看该作者

  1. buf =NULL;
  2. while(1){
  3.     if(condition)
  4.           buf =  malloc();


  5.   if(buf != NULL)
  6.       free(buf);
  7.       buf =NULL;  /* Prevent double freeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee */
  8. }
复制代码

论坛徽章:
0
14 [报告]
发表于 2013-04-18 16:18 |只看该作者
回复 13# folklore


    改成你这样了,结果如下:
*** glibc detected *** ./a.out: double free or corruption (out): 0x08b93118 ***
======= Backtrace: =========
/lib/i686/nosegneg/libc.so.6[0x670716]
/lib/i686/nosegneg/libc.so.6(cfree+0x90)[0x673c80]
./a.out[0x804930b]
/lib/i686/nosegneg/libc.so.6(__libc_start_main+0xdc)[0x61cdec]
./a.out[0x80485f1]
======= Memory map: ========
001a0000-001a1000 r-xp 001a0000 00:00 0          [vdso]
005e9000-00603000 r-xp 00000000 fd:00 4228679    /lib/ld-2.5.so
00603000-00604000 r--p 00019000 fd:00 4228679    /lib/ld-2.5.so
00604000-00605000 rw-p 0001a000 fd:00 4228679    /lib/ld-2.5.so
00607000-00747000 r-xp 00000000 fd:00 4228694    /lib/i686/nosegneg/libc-2.5.so
00747000-00749000 r--p 00140000 fd:00 4228694    /lib/i686/nosegneg/libc-2.5.so
00749000-0074a000 rw-p 00142000 fd:00 4228694    /lib/i686/nosegneg/libc-2.5.so
0074a000-0074d000 rw-p 0074a000 00:00 0
0077e000-00791000 r-xp 00000000 fd:00 4228696    /lib/i686/nosegneg/libpthread-2.5.so
00791000-00792000 r--p 00012000 fd:00 4228696    /lib/i686/nosegneg/libpthread-2.5.so
00792000-00793000 rw-p 00013000 fd:00 4228696    /lib/i686/nosegneg/libpthread-2.5.so
00793000-00795000 rw-p 00793000 00:00 0
008d0000-008db000 r-xp 00000000 fd:00 4227283    /lib/libgcc_s-4.1.2-20080102.so.1
008db000-008dc000 rw-p 0000a000 fd:00 4227283    /lib/libgcc_s-4.1.2-20080102.so.1
08048000-0804a000 r-xp 00000000 00:14 6069       /mnt/hgfs/zq/zq/linux_tcp/a.out
0804a000-0804b000 rw-p 00001000 00:14 6069       /mnt/hgfs/zq/zq/linux_tcp/a.out
08b93000-08bb4000 rw-p 08b93000 00:00 0
b7400000-b7421000 rw-p b7400000 00:00 0
b7421000-b7500000 ---p b7421000 00:00 0
b75a1000-b75a2000 ---p b75a1000 00:00 0
b75a2000-b7fa3000 rw-p b75a2000 00:00 0
b7fb7000-b7fb9000 rw-p b7fb7000 00:00 0
bfaf6000-bfb0c000 rw-p bfaf6000 00:00 0          [stack]
已放弃

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
15 [报告]
发表于 2013-04-18 16:48 |只看该作者
回复 10# zqh1630


上一次condition为真,你malloc了也free了,但是指针还是非null
下一次condition为假,你没malloc但是free了,就double free了

逻辑太明显了

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
16 [报告]
发表于 2013-04-18 17:36 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
17 [报告]
发表于 2013-04-19 09:27 |只看该作者
zqh1630 发表于 2013-04-18 16:18
回复 13# folklore

你照我说的对比过了吗?

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
18 [报告]
发表于 2013-04-19 09:32 |只看该作者
cjaizss 发表于 2013-04-19 09:27
你照我说的对比过了吗?

如果你对比过发现malloc和free是对应的,那么你九成九是发生了越界行为,不小心修改了堆的数据结构
比如以下代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
        int *a;
        int b;
        a=malloc(sizeof(int));

        memset(a,0,sizeof(int)*4);


        scanf("%d",&b);
        free(a);
        return 0;
}

论坛徽章:
0
19 [报告]
发表于 2013-04-19 09:41 |只看该作者
回复 15# cokeboL


    if(buf != NULL){
                        free(buf);
                        printf("free address buf = %x\n", buf);
                        buf = NULL;
                }

我改成了这样,还是报错!!

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
20 [报告]
发表于 2013-04-19 09:47 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP