【问题标题】:Memory leak when splitting sentences with strtok使用 strtok 拆分句子时的内存泄漏
【发布时间】:2010-08-05 15:04:21
【问题描述】:

我正在尝试将字符串拆分为句子(由句子分隔符分隔)。代码本身可以工作,但我在函数中不断出现内存泄漏。

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;

}

我找不到它泄漏内存的原因。有人知道吗?

【问题讨论】:

  • 您也可以将您的所有malloc/memset 组合组合到对calloc 的调用中,这将使您的代码更容易捕获。
  • 你调用 malloc() 四次和 free() 两次。你必须 free() 任何你 malloc() 的东西。

标签: c memory-leaks strtok


【解决方案1】:

这是一个内存泄漏:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2015-01-31
          • 2010-12-02
          • 2021-09-24
          • 2016-05-20
          • 1970-01-01
          • 2013-10-16
          • 2011-02-28
          • 1970-01-01
          • 2021-07-06
          相关资源
          最近更新 更多