关于while(1)中malloc和free的使用?

yy126163 2013-04-18 09:32:59
是不是在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]

已放弃
...全文
378 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
yy126163 2013-04-23
  • 打赏
  • 举报
回复
引用 16 楼 zhao4zhong1 的回复:
是非颠倒
能说详细点吗??
赵4老师 2013-04-23
  • 打赏
  • 举报
回复
[code=c]
void *buf=NULL;
int condition=1;
while (1) {
    if (condition) {
        if (buf==NULL) {
            buf=malloc(100);
            if (buf==NULL) break;
        }
        //...
        free(buf);
        buf=NULL;
    }
}
[/code]
赵4老师 2013-04-19
  • 打赏
  • 举报
回复
是非颠倒
yy126163 2013-04-18
  • 打赏
  • 举报
回复
引用 4 楼 majia2011 的回复:
这么用,很浪费
此话怎解??
yy126163 2013-04-18
  • 打赏
  • 举报
回复
引用 11 楼 starytx 的回复:
如果你的buf每次开辟的空间差不多,最好在循环外一次性开辟一个足够大的,循环外不用后再释放了,每次在循环中开辟可能会产生内存碎片
好的,我试试!!!
yy126163 2013-04-18
  • 打赏
  • 举报
回复
引用 3 楼 starytx 的回复:
while(1){ buf = NULL; // 初始化一下,防止没有进条件 if(condition) buf = malloc(); if(buf != NULL) // 这里应该是不为NULL才释放 free(buf); }
我改了,可还是不行啊!!! 为什么?? 纠结死了!!
starytx 2013-04-18
  • 打赏
  • 举报
回复
如果你的buf每次开辟的空间差不多,最好在循环外一次性开辟一个足够大的,循环外不用后再释放了,每次在循环中开辟可能会产生内存碎片
yy126163 2013-04-18
  • 打赏
  • 举报
回复
引用 5 楼 zhaopeng2511 的回复:
引用 2 楼 lin5161678 的回复:注意吧buf 赋值为NULL 可以是 C/C++ code?1234567while(1){ buf = NULL; if(condition) buf = malloc(); if(buf == NULL) free(buf);} 或者是 C/C++ code?12……
我贴错源码了,不好意思!! 可还是出错!!
yy126163 2013-04-18
  • 打赏
  • 举报
回复
不好意思,各位,我贴错源码了、 我程序里边是 if(buf != NULL) free(buf); 还是运行出错!!哪位高人 给个明路啊~~
汗晕倒 2013-04-18
  • 打赏
  • 举报
回复
明显是重复free了,free后记得要将buf设置为NULL
aa573915483 2013-04-18
  • 打赏
  • 举报
回复
判断应该是 if(buf != NULL)
lin5161678 2013-04-18
  • 打赏
  • 举报
回复
引用 5 楼 zhaopeng2511 的回复:
引用 2 楼 lin5161678 的回复:注意吧buf 赋值为NULL 可以是 C/C++ code?1234567while(1){ buf = NULL; if(condition) buf = malloc(); if(buf == NULL) free(buf);} 或者是 C/C++ code?12……
疏忽了 那个错误没注意 就看见楼主未必会进入malloc 判断应该是 if(buf != NULL)
zhaopeng2511 2013-04-18
  • 打赏
  • 举报
回复
引用 2 楼 lin5161678 的回复:
注意吧buf 赋值为NULL 可以是 C/C++ code?1234567while(1){ buf = NULL; if(condition) buf = malloc(); if(buf == NULL) free(buf);} 或者是 C/C++ code?1234567while(1){ if(c……
buf == NULL表示内存没有分配成功,空间都没分配到,free还有个屁用,这样肯定会出错。。。即使分配成功,if(buf == NULL)这样写也永远不会释放已分配的内存,这样无限循环下去再多堆内存也不够用呀。。。
majia2011 2013-04-18
  • 打赏
  • 举报
回复
这么用,很浪费
starytx 2013-04-18
  • 打赏
  • 举报
回复
while(1){ buf = NULL; // 初始化一下,防止没有进条件 if(condition) buf = malloc(); if(buf != NULL) // 这里应该是不为NULL才释放 free(buf); }
lin5161678 2013-04-18
  • 打赏
  • 举报
回复
注意吧buf 赋值为NULL 可以是
	while(1){
		buf = NULL;
		if(condition)
			buf =  malloc();
		if(buf == NULL)
			free(buf);
	}
或者是
	while(1){
		if(condition)
			buf =  malloc();
		if(buf == NULL)
			free(buf);
		buf = NULL;
	}
也可以是
	while(1){
		if(condition)
			buf =  malloc();
		if(buf == NULL){
			free(buf);
			buf = NULL;
		}
	}
AnYidan 2013-04-18
  • 打赏
  • 举报
回复
引用 9 楼 zqh1630 的回复:
不好意思,各位,我贴错源码了、 我程序里边是 if(buf != NULL) free(buf); 还是运行出错!!哪位高人 给个明路啊~~
if(buf != NULL) { free(buf); buf = NULL; } 这么做,迟早出问题,内存碎片会让你头痛的
zhaopeng2511 2013-04-18
  • 打赏
  • 举报
回复
if(buf != NULL) free(buf);

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧