头痛的一个free内存空间的问题。

lonelybug 2009-04-01 05:12:04
估计是我没把指针彻底搞清楚,所以还请大家多多指教。

程序是这样子
在main.c里面:
char **input_files=(char **)malloc(sizeof(char *)*1);
int counter=0;
char file[]="Hello World!!!";
for(counter=0; counter<10; counter++)
{
if(counter==0)
input_files=(char **)malloc(sizeof(char *)*(counter+1));
else
input_files=(char **)realloc(input_files,sizeof(char *)*(counter+1));
char *temp=NULL;
temp=(char *)malloc(sizeof(char)*(strlen(file)+1));
strcpy(temp,file);
input_files[counter]=temp;
}

clean_files1(1,input_files);//再test_clean.c文件中,在test_clean.h中已经定义了这个函数

再test_clean.c中写入
int in_file_counter=0;
for(in_file_counter=0; in_file_counter<size; in_file_counter++)
{
printf("%s\n",files[in_file_counter]);
free(files[in_file_counter]);
printf("%s\n",files[in_file_counter]);//依然存在,并没有清空.
}

free(files);
files=NULL;

最后用memwatch来查看内存泄漏,发现没有办法free在main.c文件中的input_files的内容。

实在是不知道其中的道理,希望有经验的朋友解释一下。谢谢了。


...全文
240 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
operatingtuzi 2009-04-04
  • 打赏
  • 举报
回复
通常内存并不会被马上回收,如果后来又用到了 那块内存才会被写上新的内容
lonelybug 2009-04-02
  • 打赏
  • 举报
回复
我已经自己解决了。

谢谢各位了,虽然你们一直在围绕着几个不是很重要的问题上回答我的问题。不过还是感谢你们的回答和时间。

  • 打赏
  • 举报
回复
free(files[in_file_counter]);
printf("%s\n",files[in_file_counter]);//依然存在,并没有清空.
}


在不同文件的指针,你得extern才能获取啊.
olla168 2009-04-02
  • 打赏
  • 举报
回复
char **input_files =(char **)malloc(sizeof(char *)*1);
int counter=0;
char file[]="Hello World!!!";
for(counter=0; counter <10; counter++)
{
if(counter==0)
input_files=(char **)malloc(sizeof(char *)*(counter+1));
else
input_files=(char **)realloc(input_files,sizeof(char *)*(counter+1));
char *temp=NULL;
temp=(char *)malloc(sizeof(char)*(strlen(file)+1)); //strlen(file)+1 == 15
strcpy(temp,file);
input_files[counter]=temp;
}


这段代码的最终效果是这样的:
{input_files}----->{input_files[0]}------>{"Hello World!!!"}
{input_files[1]}------>{"Hello World!!!"}
{input_files[2]}------>{"Hello World!!!"}
...
{input_files[9]}------>{"Hello World!!!"}

clean_files1(1,input_files);//再test_clean.c文件中,在test_clean.h中已经定义了这个函数

再test_clean.c中写入
int in_file_counter=0;
for(in_file_counter=0; in_file_counter <size; in_file_counter++)
{
printf("%s\n",files[in_file_counter]);
free(files[in_file_counter]);
files[in_file_counter] = NULL; //add this
printf("%s\n",files[in_file_counter]);//依然存在,并没有清空.
}

free(files);
files=NULL;
ltc_mouse 2009-04-02
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 lonelybug 的回复:]
我已经自己解决了。

谢谢各位了,虽然你们一直在围绕着几个不是很重要的问题上回答我的问题。不过还是感谢你们的回答和时间。
[/Quote]
那最重要的原因是什么呢?
lz能不吝分享下吗?
hengcai001 2009-04-01
  • 打赏
  • 举报
回复
free释放地址有要求吗,,是不是严格对应malloc的分配时的地址,
ltc_mouse 2009-04-01
  • 打赏
  • 举报
回复
1. 程序最开始的那个malloc没有相应的释放内存,在第一次循环时丢了这块内存
char **input_files=(char **)malloc(sizeof(char *)*1);

2. 函数clean_files1的参数意义是什么?如果第一个参数表示size,则没有释放的多了
clean_files1(1,input_files);//在test_clean.c文件中,在test_clean.h中已经定义了这个函数

3. 在指针释放后又使用了,有个名称叫"野指针"~ (free回收内存,但对内存里的数据如何处理,没有规定)
free(files[in_file_counter]);
printf("%s\n",files[in_file_counter]);//依然存在,并没有清空.
iamu_87 2009-04-01
  • 打赏
  • 举报
回复
printf("%s\n",files[in_file_counter]);//依然存在,并没有清空.
不知楼主说得没释放是根据这个吗?指针申请了未必成功,空间释放了,指针未必为空,数据还是在的,只不过意思是说系统可以把这块内存拿来干别的事情了,但是如果系统没使用的话,数据还是原来的数据,所以叫“脏数据”,所以必须释放后,在给它赋空。这样就不能再访问那块内存了
lonelybug 2009-04-01
  • 打赏
  • 举报
回复
经过我反复测试,我发现,如果在main()函数中使用malloc创建的数据是不能在其他文件中的函数进行free的,我想这可能是跟变量生命有关系。

mengde007 2009-04-01
  • 打赏
  • 举报
回复
[Quote=引用楼主 lonelybug 的帖子:]
for(in_file_counter=0; in_file_counter <size; in_file_counter++)
{
printf("%s\n",files[in_file_counter]);
free(files[in_file_counter]);
printf("%s\n",files[in_file_counter]);//虽然释放了,但是地址是系统的,依然存在,所以你//读的数据应该比较“脏”
}
[/Quote]
lonelybug 2009-04-01
  • 打赏
  • 举报
回复
我可能没说清楚,我说的是。清空数组的函数和主程序是分开的。

我希望朋友们在回答问题之前,仔细看我的问题发生的背景和环境,谢谢帮忙。

在同一个程序下面,这个没有问题,不过如果放在两个文件中,分开处理就会不能清空,很奇怪,我也不太明白。
lonelybug 2009-04-01
  • 打赏
  • 举报
回复
我可能没说清楚,我说的是。清空数组的函数和主程序是分开的。

我希望朋友们在回答问题之前,仔细看我的问题发生的背景和环境,谢谢帮忙。

在同一个程序下面,这个没有问题,不过如果放在两个文件中,分开处理就会不能清空,很奇怪,我也不太明白。
kenstar 2009-04-01
  • 打赏
  • 举报
回复
我是这样改了下,能运行了,不过内存是否完全释放了没,我就不知道了:


#include "stdio.h"
#include "stdlib.h"
#include "string.h"

void del_memory(char **p) // 释放空间
{
int i;
for (i=0; i<10; i++)
{
printf("%s",*(p+i));
free(*(p+i));
}
}

void main()
{
// char **input_files=(char **)malloc(sizeof(char *)*1); 这不用申请内存吧
char **input_files;
int counter=0;
char file[]="Hello World!!!";
char * temp =NULL; //这里改动了

for(counter=0; counter <10; counter++)
{
if(counter==0)
input_files=(char **)malloc(sizeof(char *)*(counter+1));
else
input_files=(char **)realloc(input_files,sizeof(char *)*(counter+1));
temp = (char *)malloc(sizeof(char)*(strlen(file)+1));
strcpy(temp,file);
input_files[counter]=temp;

/*input_files[counter]指向temp的内容,
故不能清除temp的内存空间,
待会儿用input_files[counter]来释放*/
}
del_memory(input_files); //释放空间
}


没有完全按楼主的要求做,楼主自己应该知道怎么改了吧,
当然是在我做的是对的情况下了,不对的话,记得通知一下
yangqidong 2009-04-01
  • 打赏
  • 举报
回复
char **input_files=(char **)malloc(sizeof(char *)*1); 

这行代码不起作用,分配的空间也没释放
lonelybug 2009-04-01
  • 打赏
  • 举报
回复
关于脏数据方面就扯远了。

脏数据不脏数据不要紧。我现在关注的是内存泄露,就算我给赋予NULL,变成非野指针,一样是内存泄露,这个跟是不是野指针并无关系。

没错,同样的程序如果放在一个.c文件中就可以顺利清楚。

谢谢了,实在是高不清楚。
liliangbao 2009-04-01
  • 打赏
  • 举报
回复
LZ的意思是:“在同一个程序下面,这个没有问题,不过如果放在两个文件中,分开处理就会不能清空”

我认为将内存释放后,只是告知该存储可以被其它申请使用,并不是马上就将该内存的原数据清除或改变,这都是系统随机做或者不做的事情。
它关心的只是是否可被再次使用,数据是什么他就不管了!
你释放后,再次使用,数据可能和原来一样以可能和原来不一样。系统不给予保证了!
Paradin 2009-04-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 liuzdof30517 的回复:]
printf("%s\n",files[in_file_counter]);//依然存在,并没有清空.
不知楼主说得没释放是根据这个吗?指针申请了未必成功,空间释放了,指针未必为空,数据还是在的,只不过意思是说系统可以把这块内存拿来干别的事情了,但是如果系统没使用的话,数据还是原来的数据,所以叫“脏数据”,所以必须释放后,在给它赋空。这样就不能再访问那块内存了
[/Quote]

一模一样就不脏么
lonelybug 2009-04-01
  • 打赏
  • 举报
回复
我当然知道什么叫做脏内存,我之所以没有用NULL进行清空就是为了看内容,内容和之前的一抹一样,难道也是脏的么!?

我用的是memwatch这个内存泄露检测工具来查看的。我非常感谢各位的留言,不过我真的希望你们留言之前看清楚我的问题,和我的问题的描述。不要只是是看我的代码。


谢谢,希望还有朋友可以帮个忙。
foxyz123 2009-04-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 liuzdof30517 的回复:]
printf("%s\n",files[in_file_counter]);//依然存在,并没有清空.
不知楼主说得没释放是根据这个吗?指针申请了未必成功,空间释放了,指针未必为空,数据还是在的,只不过意思是说系统可以把这块内存拿来干别的事情了,但是如果系统没使用的话,数据还是原来的数据,所以叫“脏数据”,所以必须释放后,在给它赋空。这样就不能再访问那块内存了
[/Quote]

这有道理,指针依然还指向那块内存

69,371

社区成员

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

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