2009-08-24 2 views
3

다음 시나리오에서 method1이 실행 된 후 'stringvar'에 의해 사용 된 메모리가 해제되었는지 궁금한가요? 내가 방법 항목의 끝에서 '무료 (stringvar)'는 넣으면, 내가 stringvar이 (사실입니다) 방법 항목 내에서 초기화되지 않았다는 경고 얻을 수 있기 때문에이와 같이 범위를 벗어나면 관련 메모리를 확보 할 수 있습니까?

// Just some method 
void method2(char* str) 
{ 
    // Allocate 10 characters for str 
    str = malloc(10 * sizeof(char)); 
} 

// Just another method 
void method1() 
{ 
    char* stringvar; 
    method2(stringvar); 

    // Is the memory freed hereafter, or do I need to call free()? 
} 

나는, 부탁드립니다.

답변

22

가 아니, 메모리, 하지 해제 method1 후입니다. 예, 메모리 사용이 끝나면 free으로 전화해야합니다.

당신은 당신이 메모리를 할당 할 경우 method2에 대한 포인터에 포인터를 보내야합니다. 이것은 C 프로그래밍에서 일반적인 관용구입니다. 특히 함수의 반환 값이 정수 상태 코드 용으로 예약되어있는 경우에 특히 그렇습니다. 예를 들어,

void method2(char **str) { 
    *str = (char *)malloc(10); 
} 

char *stringvar; 
method2(&stringvar); 
free(stringvar); 
+2

입니다. method2의 다소 심각한 버그를 지적 해 주셔서 감사합니다. – emk

+1

C 코드이므로 malloc의 반환 값을 캐스팅하지 마십시오. – aib

+0

method2의 "str"을 배열로 처리하려면 * str [x]를 사용해야합니다. 그렇습니까? – pbean

0

아니요, 직접 무료()를 호출해야합니다. put char * stringvar = 0; 시도해보십시오. 경고를 표시하지 않습니다.

0

당신은 사용해야합니다 무료() 메모리 누수를해야합니다 있도록

2

뿐만 stringvar 초기화되지 않은 내부 방법 항목,하지만 방법 2 안에 그것을 위해 당신이하고있는 방법으로 메모리를 할당하는 것은 결함이다. method2 내에서 포인터의 사본을 변경하지만 method1의 포인터 사본에는 영향을 미치지 않습니다. method1의 stringvar이 method2에 의해 할당 된 메모리를 가리 키도록 이중 포인터를 사용해야합니다.

5

동적으로 할당 된 메모리가 자동으로 해제되지 않습니다. C에서는 프로그래머가 자유롭게해야 할 책임이 있습니다.

또한 -C는 값별로 변수를 전달하고 str = malloc (10 * sizeof (char)); 그냥 로컬 'str'변수에 할당합니다.

당신이 malloc을에서 얻은 포인터를 반환 할 것 같은데, 그래서 당신의 프로그램이된다 :

char *method2(void) 
{ 
    // Allocate 10 characters for str 
    return malloc(10 * sizeof(char)); 
} 

// Just another method 
void method1() 
{ 
    char* stringvar; 
    stringvar = method2(); 
    ... 
    free(stringvar); 
} 

다른 옵션, 당신은 방법 2 포인터를 전달하는 것입니다 내에서 'stringvar를'조작하려는 경우 'stringvar', 예 :

void method2(char** str) 
{ 
    // Allocate 10 characters for str 
    *str = malloc(10 * sizeof(char)); 
} 

// Just another method 
void method1() 
{ 
    char* stringvar; 
    method2(&stringvar); 
    ... 
    free(stringvar); 
} 
+1

free()를 호출하는 것을 잊지 마십시오. – plinth

+1

'sizeof (char)'는 표준에 의해 1로 보장되므로 값을 곱하지 않아도됩니다. 나는 그것이 중요하다고 생각하지 않지만, 그것 없이는 조금 더 깨끗해 보인다. –

관련 문제