malloc()后的内存一定要自己释放吗??遇到问题了!请高手指点!!

linshideyu 2005-04-28 02:00:47

下面这段小程序我用到了malloc函数,是在while循环中,按说也应该在循环中的最后释放内存,但是那样的话会出现问题(不是程序不能运行,而是运行结果不是自己想要的),在循环外释放或者不释放的话就会达到自己的要求,请问,这个free函数应该放在什么地方?为什么放在循环里面会有问题呢?谢谢了!!!


---------------源程序(changedip.c)------------------

/*该函数的作用是:从文件/etc/tmp/dip中读取每一行的内容,将其存放到一个指针数组中,
*若遇到2.2.2.2的时候则跳过不读。

* "/etc/tmp/dip"文件中的内容如下:
1.1.1.1
2.2.2.2
3.3.3.3
4.4.4.4
5.5.5.5
*/


#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int i=0;
static int dipnum=0;
int j;
FILE *fp;
char *line=NULL;
char *dip[10];
size_t len=0;
ssize_t read;

char * deadip="2.2.2.2";

/*strlen(deadip)==7;但是用getline函数从文件中读出的一行长度为8
*最后一个字符为换行符“\n”,后面在进行比较的时候,需要将从文件
*中读出的字符串中的最后一个字符去掉
*/

char *tmp=NULL; //暂存从文件中读出的一行字符串

fp=fopen("/etc/tmp/dip","r");
if(fp==NULL)
{
exit(EXIT_FAILURE);
}

while((read=getline(&line,&len,fp))!=-1)
{
tmp=(char *)malloc(7); //在此用malloc分配内存给tmp
strncpy(tmp,line,7);
printf("tmp:%s",tmp);

if(strcmp(deadip,tmp)!=0)
{
if((dip[i]=(char *)malloc(7))==0)
printf("allocate mem error!");

strncpy(dip[i],line,7);

printf("dip[%d]:%s",i,line);
printf("retrived line of length %zu: \n",read);
printf("line:%s\n",line);

i++;
// free(tmp); // 1:在此释放内存的话,结果不对

}

}

dipnum=i;
printf("the number of dip is:%d\n",dipnum);
for(j=0;j<i;j++)
printf("dip[%d]:%s\n",j,dip[j]);

for(j=0;j<i;j++)
free(dip[j]);

free(tmp); // 2:在此释放内存的话结果是正确的。

if(line)
free(line);

return EXIT_SUCCESS;
}



...全文
755 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hanxingwuqing 2005-04-28
  • 打赏
  • 举报
回复
malloc()肯定要自己释放内存,这点是肯定的,不然会造成内存泄漏。

free()是要在内存访问结束后再使用也是肯定的,需要释放内存本身就是因为这片内存不再需要。如果提前释放的话就会造成取到的数据跟期望数据不符,估计楼主就是这个原因。

free(tmp);可以试着放在在while循环内,if判断外;因为我觉得判断的时候还是占用着这一片内存的,因为你释放掉,造成了数据的错误
oyljerry 2005-04-28
  • 打赏
  • 举报
回复
既然分配的一样大小的空间,干脆循环外面的分配,循环结束了,再释放啊
oyljerry 2005-04-28
  • 打赏
  • 举报
回复
应该在malloc分配的内存访问结束了以后,才能free,这样才能保证访问时数据的可靠性
linshideyu 2005-04-28
  • 打赏
  • 举报
回复
上面的那个程序中,按说每一次循环开始的时候分配内存,循环结束的时候本次分配的内存就不需要了,应该可以释放了,下次循环开始的时候重新分配内存。但是释放后就会出现问题!

现在,假设循环了10次,malloc应该被调用了10次,那tmp是不是就被分配了10次啊,如果在循环外释放的时候,是不是也要调用free(tmp)10次呢,还是只用一次就够了???谢谢!
qifa 2005-04-28
  • 打赏
  • 举报
回复
用malloc分配的内存一定要用free释放的,否则会发生内存泄漏
什么时候释放,要看你分配的内存空间不再使用的时候就可以释放了
pcboyxhy 2005-04-28
  • 打赏
  • 举报
回复
在你不需要使用这片内存的时候就可以释放了
如果后面还可能用到
就不能释放

69,373

社区成员

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

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