所以基本上当我尝试为已分配的char **释放内存时,我无法弄清楚代码中的问题是什么。我创建了char **然后为它分配了内存,然后我将指向这个char **的指针分配给了我的struct的成员。当我试图使用struct member的指针释放内存时,我收到错误: 对象0x796568796568的 malloc: 错误:未释放指针*
以下是代码的一些部分:
Struct part:
struct TokenizerT_ {
char **currentToken;
char **tokens;
}tokenizer;
分配部分(在单独的功能中完成):
char **words;
words = (char **)malloc(sizeof(char*) * (numberOfWords + 1));
for (int i = 0; i < numberOfWords; i++)
words[i] = (char *)malloc(strlen(ts)+1);
tokenizer.tokens = words;
tokenizer.currentToken = words;
解放部分:
int i = 0;
while(*(*tk).tokens){
free((*tk).tokens[i]);
i++;
}
free((*tk).tokens);
答案 0 :(得分:2)
首先,您应该意识到*(*tk).tokens
等同于(*tk).tokens[0]
。所以你的循环总是检查相同的元素作为停止条件(并且在释放后该元素未设置为NULL
,因此条件继续为真。)
如果您希望通过NULL
指针检查停止释放循环,则首先需要确保words
的最后一个元素已分配NULL
。现在由malloc
分配的内存未初始化,因此您需要使用以下内容显式初始化最后一个元素:
words[numberOfWords] = NULL;
然后在解除分配时,您需要将循环停止条件更新为:
int i = 0;
while((*tk).tokens[i]){
free((*tk).tokens[i]);
i++;
}
free((*tk).tokens);
答案 1 :(得分:1)
添加“words [i] = 0;”到分配部分,让你的while循环停止?
for (int i = 0; i < numberOfWords; i++)
words[i] = (char *)malloc(strlen(ts)+1);
words[i] = 0;