我有一个记忆丢失的问题我无法解决:
==19660== 14,583 (1,764 direct, 12,819 indirect) bytes in 49 blocks are definitely lost in loss record 27 of 27
==19660== at 0x4023F50: malloc (vg_replace_malloc.c:236)
==19660== by 0x80489F5: AllocateFct (function.c:27)
==19660== by 0x804BB51: InsertFct (reader.c:417)
==19660== by 0x804BFFB: InsertShape (reader.c:591)
==19660== by 0x804AEED: main (main.c:103)
通过以下功能生成:
function AllocateFct(char* model)
{
function fct = (function) malloc(sizeof(struct _function_));
if (fct == NULL)
return NULL;
if (model==NULL)
fct->model = NULL;
else
{
fct->model = malloc(sizeof(char) * (strlen(model) + 1));
fct->model[0] = '\0';
if (fct->model==NULL){
fprintf(stderr,"Not enough memory!\n");
exit(1);
}
strcpy(fct->model, model);
}
fct->detail = NULL;
fct->brief = NULL;
fct->bug = NULL;
fct->f = NULL;
fct->Parameter = NULL;
fct->ret = NULL;
fct->def = NULL;
fct->next = NULL;
return fct;
}
=============================
void InsertFct(function* fct, content c)
{
if (type > 0)
{
type = c.code;
(*fct)->def = (char*) malloc(sizeof(char) * (strlen(c.message) + 1));
(*fct)->def[0]='\0';
if ((*fct)->def==NULL){
fprintf(stderr,"Not enough memory!\n");
exit(1);
}
strcpy((*fct)->def, c.message);
return;
}
switch (c.code)
{
case FN:
type = 0;
*fct = AllocateFct(c.message);
break;
case PARAM:
type = 0;
AddParameterFunction(*fct, c.message);
break;
case BRIEF:
type = 0;
AddBriefFunction(*fct, c.message);
break;
case DETAILS:
type = 0;
AddDetailFunction(*fct, c.message);
break;
case RETURN:
AddRetourFunction(*fct, c.message);
break;
case BUG:
type = 0;
AddBugFunction(*fct, c.message);
break;
default:
type = c.code;
AddDefautFunction(*fct,c.message);
break;
}
}
===========================
int InsertShape(list heading, list source, shape* finalShape, shape* tmp)
{
fileRead* file = NULL;
shape s = NULL;
shape insert = AllocateShape(NULL);
function fct = AllocateFct(NULL);
function fctlist = NULL;
int i = 0;
int j = 0;
int pile = 0;
int n = 0;
int tag = 0;
list headerlist = NULL;
content c;
char chaine;
if (heading != NULL )
{
char* recover = (char*) GetNameFile(heading->name);
s = AllocateShape(recover);
free(recover);
recover=NULL;
}
else if (source != NULL )
{
char* recover = (char*) GetNameFile(source->name);
s = AllocateShape(recover);
free(recover);
recover=NULL;
}
if (heading != NULL )
{
file = OpenFileRead(heading->name);
n = CheckInclude(file->f, &headerlist);
if (n == 0)
n = 1;
fseek(file->f, -n, SEEK_CUR);
do
{
i = 0;
j = RecoverComments(file, &c, &tag);
InsertFct(&fct, c);
if(c.message!=NULL){
free(c.message);
c.message=NULL;
}
if (type > 0)
AddToShape(insert, fct);
if (j == -5 && i == 0)
{
type = 0;
do
{
if (fscanf(file->f, "%c", &chaine) == EOF)
{
i = 0;
break;
}
} while (chaine == ' ' || chaine == '\n');
if (chaine == '/')
{
i = 1;
j = 0;
fseek(file->f, -1, SEEK_CUR);
}
}
if (i == 0 && (j == -5))
{
if (type == 0)
{
pile++;
fctlist = AddFunction(fctlist, fct);
}
else
type = 0;
}
} while (j != -3);
FreefileRead(file);
}
i = 0;
j = 0;
type = 0;
if (source != NULL )
{
file = OpenFileRead(source->name);
n = CheckInclude(file->f, &headerlist);
if (n == 0)
n = 1;
fseek(file->f, -n, SEEK_CUR);
do
{
i = 0;
j = RecoverComments(file, &c, &tag);
InsertFct(&fct, c);
if(c.message!=NULL){
free(c.message);
c.message=NULL;
}
if (type > 0)
AddToShape(insert, fct);
if (j == -5 && i == 0)
{
type = 0;
do
{
if (fscanf(file->f, "%c", &chaine) == EOF)
{
i = 0;
break;
}
} while (chaine == ' ' || chaine == '\n');
if (chaine == '/')
{
i = 1;
j = 0;
fseek(file->f, -1, SEEK_CUR);
}
}
if (i == 0 && (j == -5))
{
if (type == 0)
fctlist = TourAndChange(fctlist, fct);
else
type = 0;
}
} while (j != -3);
FreefileRead(file);
}
s->fctList = AddFunction(s->fctList, fctlist);
s->headerList = headerlist;
*finalShape = CreateListShape(*finalShape, s);
*tmp = CreateListShape(*tmp, insert);
return 1;
}
===================== 主要涉及的部分:
InsertShape(tmpheading, tmproot, &s, &s2);
if (heading == NULL){
tmpheading = NULL;
}
if (root == NULL){
tmproot = NULL;
}
}
提前感谢您的回复。
答案 0 :(得分:2)
你什么时候有空的?看起来你的代码中没有一个免费版! (除了“freefileread”,但我们不知道它是做什么的,它似乎不是为该函数设计的!)
答案 1 :(得分:1)
我注意到的事情:
fct->model = malloc(sizeof(char) * (strlen(model) + 1));
fct->model[0] = '\0';
if (fct->model==NULL){
fprintf(stderr,"Not enough memory!\n");
exit(1);
}
strcpy(fct->model, model);
这里fct->model[0] = '\0';
可以取消引用空指针。它应该删除。另外,this block of code could be replaced with a call to strdup
.
void InsertFct(function* fct, content c)
{
if (type > 0)
......什么是type
?某种全球性的?糟糕的设计,如果是这样。
此后的代码可以再次调用strdup
。
InsertShape(tmpheading, tmproot, &s, &s2);
if (heading == NULL){
tmpheading = NULL;
}
if (root == NULL){
tmproot = NULL;
}
为什么将指针设置为NULL而不先释放它们?顺便说一句,free(NULL)
什么都不做,所以你不必做if(ptr) free(ptr);
之类的事情......只需致电free(ptr);
。