关于链表结构体释放内存有关问题,不太确定,哪位高手能给个准确的说法的
关于链表结构体释放内存问题,不太确定,谁能给个准确的说法的
最近在做编译器作业,写了个链表保存token,token的属性有type和content,两个都是指针,我动态创建的,但在释放时,一旦释放这两个指针,只能释放遍历开始时的第一个结点,释放第二个时就停住了,也点不了下一步,我一步步调试时发现每个结点的token属性的内存地址都不一样,为什么就不能全部释放,难道是释放结点时结点里的所有的东西都释放掉了?我记得结构体里存放指针只是一个地址,难道不需要把指针都释放掉吗?不是每malloc分配一次内存都要free一次吗?
结构体如下:
每次分配内存时基本操作与下面的类似:
释放内存的代码如下:
不要叫我贴代码,千多行的代码贴出来看得也累,大神请看看...看看...看...
------解决方案--------------------
申请的时候好像有点小错。。你改改试试。。释放那段好像没什么问题。。
------解决方案--------------------
你申请了1个结构的内存,并且申请了里面2个指针的内存。
但是你释放的时候只释放了结构的内存,并没释放结构中2个指针的内存。
当然不对,内存泄漏。
正确的做法是,先释放2个指针的内存,再释放结构的内存。
申请的顺序是由外到内,释放的顺序是由内到外。
最近在做编译器作业,写了个链表保存token,token的属性有type和content,两个都是指针,我动态创建的,但在释放时,一旦释放这两个指针,只能释放遍历开始时的第一个结点,释放第二个时就停住了,也点不了下一步,我一步步调试时发现每个结点的token属性的内存地址都不一样,为什么就不能全部释放,难道是释放结点时结点里的所有的东西都释放掉了?我记得结构体里存放指针只是一个地址,难道不需要把指针都释放掉吗?不是每malloc分配一次内存都要free一次吗?
结构体如下:
typedef struct Token
{
char *tokenType;
char *tokenContent;
struct Token *nextToken;
}Token;
每次分配内存时基本操作与下面的类似:
sentence[i-1] = '\0';
strcpy(which, "note");
currentToken = (Token *)malloc(sizeof(Token));
currentToken->nextToken = NULL;
currentToken->tokenType = (char*)malloc(strlen(which));
strcpy(currentToken->tokenType, which);
currentToken->tokenContent = (char*)malloc(strlen(sentence));
strcpy(currentToken->tokenContent, sentence);
temp->nextToken = currentToken;
temp = temp->nextToken;
释放内存的代码如下:
void Free()
{
Token *temp, *temp1;
temp = headToken;
while (temp != NULL)
{
//free(temp->tokenType);
//free(temp->tokenContent);
temp1 = temp->nextToken;
free(temp);
temp = temp1;
}
return ;
}
不要叫我贴代码,千多行的代码贴出来看得也累,大神请看看...看看...看...
结构体;释放内存;
------解决方案--------------------
申请的时候好像有点小错。。你改改试试。。释放那段好像没什么问题。。
sentence[i-1] = '\0';
strcpy(which, "note");
currentToken = (Token *)malloc(sizeof(Token));
currentToken->nextToken = NULL;
currentToken->tokenType = (char*)malloc(strlen(which) + 1);//这里应该要+1吧。。还有最后的'\0'。。
strcpy(currentToken->tokenType, which);
currentToken->tokenContent = (char*)malloc(strlen(sentence) + 1);//这里也是。。
strcpy(currentToken->tokenContent, sentence);
temp->nextToken = currentToken;
temp = temp->nextToken;
------解决方案--------------------
你申请了1个结构的内存,并且申请了里面2个指针的内存。
但是你释放的时候只释放了结构的内存,并没释放结构中2个指针的内存。
当然不对,内存泄漏。
正确的做法是,先释放2个指针的内存,再释放结构的内存。
申请的顺序是由外到内,释放的顺序是由内到外。