C 使用strtok拆分句子时内存泄漏
我正在尝试将字符串拆分为句子(由句子分隔符分隔)。代码本身可以正常工作,但函数中不断出现内存泄漏C 使用strtok拆分句子时内存泄漏,c,memory-leaks,strtok,C,Memory Leaks,Strtok,我正在尝试将字符串拆分为句子(由句子分隔符分隔)。代码本身可以正常工作,但函数中不断出现内存泄漏 char ** splitSentences(char *string) { int sentencecount = 0; char* buf = NULL; char* str = NULL; buf = malloc((strlen(string) + 1) * sizeof(char)); strcpy(buf,string); str = buf; sentencecount = c
char ** splitSentences(char *string) {
int sentencecount = 0;
char* buf = NULL;
char* str = NULL;
buf = malloc((strlen(string) + 1) * sizeof(char));
strcpy(buf,string);
str = buf;
sentencecount = countSentences(str);
if(sentencecount != 0)
{
char** sentences = NULL;
sentences = malloc((sentencecount + 1)*sizeof(char*));
memset(sentences,0,sentencecount+1);
char* strToken = NULL;
strToken = malloc((strlen(str)+1)*sizeof(char));
memset(strToken,0,strlen(str)+1);
strToken = strtok(str, SENTENCE_DELIMITERS);
int i = 0;
while(strToken != NULL) {
sentences[i] = NULL;
sentences[i] = malloc((strlen(strToken)+1)*sizeof(char));
strncpy(sentences[i], strToken,strlen(strToken) + 1);
strToken = strtok(NULL, SENTENCE_DELIMITERS);
i++;
}
sentences[sentencecount] = NULL;
//Free the memory
free(strToken);
strToken = NULL;
free(buf);
buf = NULL;
return sentences;
}
return NULL;
}
我找不出它为什么会泄露内存。有人知道吗?这里有一个内存泄漏:
strToken = malloc((strlen(str)+1)*sizeof(char));
// ...
strToken = strtok(str, SENTENCE_DELIMITERS);
您使用
malloc
为对象分配空间,然后在调用strtok
您malloc
语句并将其返回给调用者后,丢失指向该空间的指针。在那里释放它吗?strtok()
返回指向字符串中找到的令牌的指针。在您的示例中,我认为不需要分配strToken变量(它只是一个指针)。尝试删除:
strToken = malloc((strlen(str)+1)*sizeof(char));
memset(strToken,0,strlen(str)+1);
您不应该使用malloc字符串来保存strtok的返回值。
请查看参考资料以了解更多信息。因此,memleak。您还可以将所有的malloc/memset
组合组合起来调用calloc
,这将使您的代码更容易捕获。您可以调用malloc()四次,调用free()两次。你必须释放()你想要的任何东西。