2010-08-05 2 views
4

문자열을 문장으로 분리하려고합니다 (문장 구분 기호로 구분). 코드 자체는 작동하지만 함수에서 메모리 누수가 계속 발생합니다.문장을 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; 

}

는 메모리 누수 이유를 찾을 수 없습니다. 아는 사람 있나요?

+0

'malloc/memset'의 모든 조합을'calloc' 호출과 결합 할 수도 있습니다. 그러면 코드를 쉽게 캡처 할 수 있습니다. –

+1

malloc()을 네 번 호출하고 free()를 두 번 호출합니다. 너는 무엇이든 malloc()을 자유롭게 해줘야한다. – Dingo

답변

9

다음은 메모리 누수의 :

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

그런 다음 strtok을 호출 한 후 그 공간에 대한 포인터를 잃고, malloc을 가진 객체를위한 공간을 할당합니다.

+0

그것은 작동합니다! 많은 감사합니다! – Moox

1

malloc 문장 및 발신자에게 return입니다. 거기서 해방합니까?

1

strtok() 문자열에서 발견 된 토큰에 대한 포인터를 반환합니다. 귀하의 예제에서, 나는 strToken 변수를 할당 할 필요가 있다고 생각하지 않는다. 다음을 제거해보십시오 :

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

strtok의 반환 값을 저장하는 데 사용되는 문자열을 malloc해서는 안됩니다. strtok에 대한 참조를 확인하십시오. 그러므로 memleak.

관련 문제