Утечка памяти при разбиении предложений с помощью strtok - PullRequest
4 голосов
/ 05 августа 2010

Я пытаюсь разбить строку на предложения (разделенные разделителями предложений). Сам код работает, но я продолжаю получать утечки памяти в функции.

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 ]

9 голосов
/ 05 августа 2010

Вот утечка памяти:

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

Вы выделяете пространство для объекта с помощью malloc, а затем теряете указатель на это пространство после вызова strtok.

1 голос
/ 05 августа 2010

strtok() возвращает указатель на токен, найденный в строке.В вашем примере я не верю, что вам нужно размещать переменную strToken (это просто указатель).Попробуйте удалить:

strToken = malloc((strlen(str)+1)*sizeof(char));
memset(strToken,0,strlen(str)+1);
1 голос
/ 05 августа 2010

вы malloc предложения и return это звонящему. Вы там бесплатно?

0 голосов
/ 05 августа 2010

Вы не должны использовать строку malloc, которая используется для хранения возвращаемого значения strtok. Проверьте ссылку для strtok . Отсюда и утечка памяти.

...