免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 6900 | 回复: 33
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-04-18 12:58 |只看该作者 |倒序浏览
是不是在while(1)中不能用malloc和free, 我就是在

while(1){
   if(condition)
         buf =  malloc();


  if(buf != NULL)
     free(buf);

}

写的程序,是这个具体流程,
但是运行一段时间后,会出现如下错误代码:
不知道为啥?

*** glibc detected *** ./a.out: double free or corruption (top): 0x09891118 ***
======= Backtrace: =========
/lib/i686/nosegneg/libc.so.6[0x670716]
/lib/i686/nosegneg/libc.so.6(cfree+0x90)[0x673c80]
./a.out[0x8048d99]
/lib/i686/nosegneg/libc.so.6(__libc_start_main+0xdc)[0x61cdec]
./a.out[0x8048611]
======= Memory map: ========
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
00ea6000-00ea7000 r-xp 00ea6000 00:00 0          [vdso]
08048000-0804a000 r-xp 00000000 fd:00 3255675    /nfs/ipcamera/a.out
0804a000-0804b000 rw-p 00001000 fd:00 3255675    /nfs/ipcamera/a.out
09891000-098b2000 rw-p 09891000 00:00 0
b7400000-b7421000 rw-p b7400000 00:00 0
b7421000-b7500000 ---p b7421000 00:00 0
b75a3000-b75a4000 ---p b75a3000 00:00 0
b75a4000-b7fa5000 rw-p b75a4000 00:00 0
b7fb9000-b7fbb000 rw-p b7fb9000 00:00 0
bfafd000-bfb13000 rw-p bfafd000 00:00 0          [stack]

已放弃

论坛徽章:
0
2 [报告]
发表于 2013-04-18 13:00 |只看该作者
是不是因为Free之后没有置空?

论坛徽章:
0
3 [报告]
发表于 2013-04-18 13:01 |只看该作者
回复 2# skychgg


   

我在while(1)
{
     buf = NULL;
.........
}

还是不行!!

论坛徽章:
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
4 [报告]
发表于 2013-04-18 13:13 |只看该作者
condition为0了?

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
5 [报告]
发表于 2013-04-18 13:26 |只看该作者
应该怀疑自己逻辑写错了

论坛徽章:
0
6 [报告]
发表于 2013-04-18 13:59 |只看该作者
观点同楼上!
贴完整代码。

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

论坛徽章:
0
8
发表于 2013-04-18 15:55
回复 5# hellioncu


            while(1){

                recv_num = read(sock_fd, re_buf, 2000);

                if(strncmp(re_buf, ipcam_video_trans_proto, 4) == 0)
                {
                        pic_len =  ((uint16_t *)(&re_buf[32]))[0];

                        buf = (uint8_t *)malloc(pic_len);
                        if(buf == NULL){
                                printf("malloc error for pic buf! \n");
                                return -1;
                        }       

                        memset(buf, 0, pic_len);
                       
                        total_num = recv_num - 36;
                                               
                        memcpy(buf, re_buf+36, recv_num-36);

                        while( total_num < pic_len){
                                recv_num = read(sock_fd, re_buf, 2000);
                                memcpy(buf+total_num, re_buf, recv_num);
                                total_num = recv_num + total_num;
                        }
                }
       
                if(buf != NULL)
                        free(buf);

        }
       

这是完整代码!!!

论坛徽章:
0
9 [报告]
发表于 2013-04-18 15:55 |只看该作者
回复 7# pmerofc


   

为啥??

论坛徽章:
0
10 [报告]
发表于 2013-04-18 15:58 |只看该作者
回复 4# cokeboL


    condition为0,那就不进行malloc呗。

对这个有影响??
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP