2009-06-28 3 views
4

문자열을 연결하고 결합 된 문자열을 반환하는 작은 함수를 만들었습니다. 그러나 함수에서 세 번째 변수에 메모리를 할당 했으므로 함수가 완료되면 메모리를 해제 할 것인가 아니면 나중에 메모리를 확보해야 할 것인가? 그리고 그것을 해제해야한다면, 가장 세련된 솔루션은 무엇일까요?이 누수 메모리가 맞습니까?

다음은 테스트 코드입니다. 그것은 작동하지만 메모리가 해제되었는지 또는 내 도구로 해제되었는지 알 수 없습니다.

#include <stdio.h> 
#include <math.h> 
#include <string.h> 

char * StrCat(const char *st1, const char *st2){ 
    char *string = calloc((strlen(st1) + strlen(st2) + 1), sizeof(char)); 
    strcat(string, st1); 
    strcat(string, st2); 
    return string; 
} 

int main(){ 
    printf("String: %s\n", StrCat("HELLO ", "WORLD")); 
    return 0; 
} 
+0

예. 모든 것을 자동화하고 코드를 더 쉽게 사용하기 위해이 기능을 사용했습니다. 그러나 StrCat가 대문자임을주의하십시오. 표준 strcat 호출이 아닙니다. –

+0

방금 ​​알아 챘습니다. 'StrCat'은 'strcat'과 유사합니다. 나는 그것을 'myStrCat'이라고 추천했다. –

+0

오, 의도적인데, 잘 작동하고 다른 문자열 기능을 사용했습니다. 그러나 당신이 그것을 나쁜 습관으로 생각한다면 나는 그것을 바꿀 것이다. –

답변

13

예. 자유롭게해야합니다.

아마 뭔가 같은 :

int main(){ 
    char *s = StrCat("HELLO ", "WORLD"); 
    printf("String: %s\n", s); 
    free(s); 
    return 0; 
} 
+0

calloc은 메모리를 0으로 만든다. 그래서 여분의 memset이 필요 없다. 또는 무엇이든 (@DalGr에는 malloc이 대신 사용되었지만 그는 그렇게하지 않았습니다.) –

+0

calloc이 메모리를 0으로 설정합니다. –

+0

calloc()의 구현을 잊었습니다. 감사. –

3

예, 당신은 그것을 해제해야합니다. valgrind를 사용하여 누출을 감지하십시오.

3

예. calloc, malloc, new 등을 호출하면 메모리를 해제하는 함수를 호출해야합니다.

5

printf가 끝나면 응용 프로그램이 끝나기 때문에 응용 프로그램이 종료 될 때 응용 프로그램에서 수행하므로 실제로 응용 프로그램을 종료 할 필요가 없습니다. 그러나 그렇습니다, 항상 그것을 해방하는 것이 좋습니다.

+1

나는 원리에서 당신과 동의한다, 그러나 말썽에있는 사람들을 얻는 생각의이 종류. 특히 초보자. – Steve

2

메모리 누수와 사용 가능한 메모리가 까다로운 문제입니다. 디버거를 시험해 볼만한 가치가 있습니까? 나는 그러한 문제를 해결하기 위해 표범 모기를 사용한다.