【发布时间】:2016-01-27 06:35:20
【问题描述】:
在同一个文件中,我有两个例程。第一个将存储一个文件中的一些字节。另一个会将此信息提供给将处理该信息的例程。
boolean
adin_memory(char* buffer, int size_chunck, int end_flag){
real_data=(SP16 *)malloc(size_chunck); //real_data -->global
memcpy(&(real_data[0]),&(buffer[0]),size_chunck);
pos_write += size_chunck;
global_size = size_chunck;
global_end_flag = end_flag;
//end_flag = 1 --> end of Stream
//end_flag = 0 --> Streaming
return TRUE;
}
为了防止泄漏的可能性,我使用了malloc。但是这个例程被调用了好几次。所以,在adin_memory 和adin_read (将是free)的一些重复之后,我认为内存开始碎片化(我可以看到任务管理器中输入文件大小的泄漏 - RAM 的增量) .那正确吗?我怎样才能防止这种情况?要查看此泄漏,我在 adin_memory 的开头和结尾放置了一个断点,然后查看任务管理器。
int
adin_read(SP16 *buf, int sampnum)
{
FILE *fp;
int cnt = 0;
fp = gfp;
//(.......)
if(global_end_flag == 1 || pos_write == pos_read){ return -1;}
for(i = pos_read/sizeof(SP16); i <= sampnum; i++){
if(i >= pos_write/sizeof(SP16)) {
cnt = i;
//(....)
break;
}
buf[i] = real_data[i];
}
pos_write = 0;
//(....)
free(real_data);
return cnt;
}
【问题讨论】:
-
这有助于避免堆碎片 -stackoverflow.com/questions/150753/…
-
To prevent leaking I am using malloc.???错字? -
在
adin_read释放real_data之前,您是否再次致电adin_memory?因为这会泄漏real_data的当前值所指向的内存。 -
@IanAbbott 您的意思是“双重免费泄漏”吗?现在你这么说我认为是可能的。让我检查一下..
-
我认为 Ian 指的是通过分配新分配的内存来覆盖全局句柄的情况。另外,如果你释放一个全局变量,你应该将它设置为
NULL以避免重复frees。
标签: c memory-leaks