【发布时间】:2015-02-07 23:46:46
【问题描述】:
我现在正在研究的是一个基于状态的解析器,用于处理来自流的任何输入。我的教授告诉我这是避免特殊情况的最好方法。我设置它的方式是使用函数,我在尝试重用分配的内存时遇到了一些麻烦,所以我不会造成任何泄漏。我正在解析的是多个参数。每个参数都有一个名称和一个值。一个示例输入是:
parameterName = 500;
名称为parameterName,类型为integer,值为500。
我能够成功地解析其中一个而没有内存泄漏。但是,执行第二个参数会导致泄漏,我知道原因:这是 malloc 在我的参数名称上的多次使用。
看一下解析代码:
int main()
{
int x;
char c;
char *nameTemp;
int hasName = 0;
int hasEqual = 0;
/* ParameterManager values */
ParameterManager *pm;
pm = PM_create(500);
if((PM_manage(pm, "name", INT_TYPE, 1)));
while((x = getchar()) != EOF)
{
/* Cast int to char */
c = (char)x;
/* Whitespace state */
if((isspace(c)))
{
c = whitespace();
}
/* Comment state */
if(c == '#')
{
c = comment();
}
/* Name state */
if(((isalnum(c)) && hasEqual == 0 && hasName == 0))
{
nameTemp = name(c);
printf("Name: %s\n", nameTemp);
hasName = 1;
}
/* Equal state */
if(c == '=' && hasName == 1 && hasEqual == 0)
{
hasEqual = 1;
}
/* Value state */
if((isalnum(c)) && hasName == 1 && hasEqual == 1)
{
getValues(c, nameTemp, pm->t_List, pm->m_List);
hasName = 0;
hasEqual = 0;
}
}
free(nameTemp);
if((PM_destroy(pm)) && DEBUG) printf("Success destroying PM.\n");
return 0;
}
nameTemp = name(c) 下的/* Name state */ 行返回一个分配的字符串。该字符串稍后被传递以执行其他工作。但是,由于整个解析思路是在一个循环中,因此会对同一个字符串生成多个 malloc。我只能释放一次 nameTemp,但该名称上有多个 mallocs。如何一遍又一遍地重复使用 nameTemp 而不会造成任何泄漏?
这是分配了 nameTemp 的一段代码(在函数name() 中):
/* Make sure temp is not NULL before mallocing */
if(temp[0] != '\0')
{
returnName = malloc(sizeof(char)*strlen(temp)+1);
strncpy(returnName, temp, strlen(temp)+1);
temp[0] = '\0';
return returnName;
}
如果有一些不清楚的地方,我深表歉意。我尽量笼统地说,如果您需要更多说明,请告诉我。
【问题讨论】: