用strtok分割句子时内存泄漏

时间:2010-08-05 15:04:21

标签: 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 = 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;

}

我无法找到泄漏内存的原因。有谁知道吗?

4 个答案:

答案 0 :(得分:9)

这是内存泄漏:

strToken = malloc((strlen(str)+1)*sizeof(char));
// ...
strToken = strtok(str, SENTENCE_DELIMITERS);

您为malloc的对象分配空间,然后在调用strtok后丢失指向该空间的指针。

答案 1 :(得分:1)

malloc个句子,return给来电者。你在那里释放它吗?

答案 2 :(得分:1)

strtok()返回指向字符串中找到的标记的指针。在您的示例中,我不认为您需要分配strToken变量(它只是一个指针)。尝试删除:

strToken = malloc((strlen(str)+1)*sizeof(char));
memset(strToken,0,strlen(str)+1);

答案 3 :(得分:0)

你不应该使用malloc字符串来保存strtok的返回值。 检查strtok的参考。因此,memleak。