程序正在泄漏内存并且无法修复它...该程序正在从文本文件读取数据,读取数据后,它会在泄漏内存期间对数据执行某些操作。设备的内存和闪存驱动器非常有限,因此我无法运行内存泄漏检查工具。 请建议修复内存泄漏问题 请在下面找到代码片段
int LanguageRequiredData(void)
{
char *data=NULL;
int retValue = 0 ;
retValue = GetString_English(&data);
if(retValue>0 && strlen(data)>0)
{
// Do Some Operation
}
if (data!=NULL)
{
Mem_free(data);
data = NULL;
}
}
int GetString_English(char **data)
{
int retValue = 0 ;
retValue = File_LoadContent(LANGSENGFILE,&(*data));
return retValue;
}
int File_LoadContent (char *file, char **content)
{
long size = File_Size(file);
char buf[256]={};
memset(buf,0x00,sizeof(buf));
if (*content)
{
Mem_free(*content);
}
*content = (char*) Mem_alloc((size+1) * sizeof(char));
TFILE * fd; fd=File_Open(file,"r"); if (fd==NULL) return 0;
while (File_Gets(buf,sizeof(buf),fd)!=NULL)
{
strcat(*content,buf);
memset(buf,0x00,sizeof(buf));
}
File_Close(fd); return 1;
}
void * Mem_alloc(size_t size)
{
int i;
void * ptr = NULL;
for (i = 0; i < 2; i++)
{
ptr = malloc(size);
if (ptr)
{
break;
}
}
if (ptr)
{
memset(ptr, 0, size);
}
return ptr;
}
void Mem_free(void * ptr)
{
if (ptr != NULL)
{
free(ptr);
}
ptr = NULL;
}
最佳答案
这部分似乎很可疑:
while (File_Gets(buf,sizeof(buf),fd)!=NULL)
{
strcat(*content,buf);
memset(buf,0x00,sizeof(buf));
}
特别是strcat()
。 File_Gets()
是否以 null 终止写入 buf[]
的内容?如果不是,那么 strcat()
的读取/复制可能超出了 buf[]
的范围,因为它需要空终止来知道何时停止。
编辑:我应该指出,这是推荐 strncat()
而不是 strcat()
的原因之一。使用字符串函数的“n”个变体(即 strncat()
、strncpy()
、strncmp()
)有助于防止缓冲区溢出和通常是一个很好的做法。
关于C 内存泄漏问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43993787/