头痛的一个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的内容。

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


...全文
247 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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]

这有道理,指针依然还指向那块内存
本文通过Glibc的内存暴增问题,主要介绍了系统的内存管理问题,具体如下: 目录 1. 问题 2. 基础知识 2.1 X86平台Linux进程内存布局 2.1.1 32位模式下进程内存经典布局 2.1.2 32位模式下进程默认内存布局 2.1.3 64位模式下进程内存布局 2.2 操作系统内存分配的相关函数 2.2.1 Heap操作相关函数 2.2.2 Mmap映射区域操作相关函数 3. 概述 3.1 内存管理一般性描述 3.1.1 内存管理的方法 3.1.2 内存管理器的设计目标 3.1.3 常见C内存管理程序 3.2 Ptmalloc内存管理概述 3.2.1 简介 3.2.2 内存管理的设计假设 3.2.3 内存管理数据结构概述 3.2.4 内存分配概述 3.2.5 内存回收概述 3.2.6 配置选项概述 3.2.7 使用注意事项 4. 问题分析及解决 5. 源代码分析 5.1 边界标记法 5.2 分箱式内存管理 5.2.1 Small bins 5.2.2 Large bins 5.2.3 Unsorted bin 5.2.4 Fast bins 5.3 核心结构体分析 5.3.1 malloc_state 5.3.2 Malloc_par 5.3.3 分配区的初始化 5.4 配置选项 5.5 Ptmalloc的初始化 5.5.1 Ptmalloc未初始化时分配/释放内存 5.5.2 ptmalloc_init()函数 5.5.3 ptmalloc_lock_all(),ptmalloc_unlock_all(),ptmalloc_unlock_all2() 5.6 多分配区支持 5.6.1 Heap_info 5.6.2 获取分配区 5.6.3 Arena_get2() 5.6.4 _int_new_arena() 5.6.5 New_heap() 5.6.6 get_free_list()和reused_arena() 5.6.7 grow_heap(),shrink_heap(),delete_heap(),heap_trim() 5.7 内存分配malloc 5.7.1 public_mALLOc() 5.7.2 _int_malloc() 5.8 内存释放free 5.8.1 Public_fREe() 5.8.2 _int_free() 5.8.3 sYSTRIm()和munmap_chunk(

70,023

社区成员

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

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