2014-09-28 2 views
-1

가변"malloc"메모리가 암시 적으로 해제됩니까? 고려

I이 sTmp 또 다른 변수를 지정하는 경우, 자동으로 해제 얻을이 변수로 할당 된 메모리를 수행하거나, 메모리 블록은 프로세스가 종료 될 때까지 (& 쓸모)가 할당 된 상태로 유지하지 malloc 정의 (char *)sTmp, ?

나 코드로 설명하자

int main() { 
    char *sTmp = (char *) malloc (50); 
    char *sNew = strdup ("some text"); // length is less than 50 
    sTmp = sNew; 
    /* now sTmp points to sNew and it's length is 10 chars 
     I wonder, what happened to the allocated memory of 50 chars in the first line; 
     Does it get freed implicitly or remain allocated? 
    */ 
} 
+0

메모리 누수가 발생했습니다. 메모리는 계속 할당됩니다. – perh

답변

2

메모리 영역이 malloc -ed가 아닌 free -d가 아니기 때문에 memory leak이 있습니다.

그러나 대부분의 운영 체제 (특히 Linux 및 기타 POSIX 시스템)에서 OS는 process이 종료 된 후 모든 리소스 (메모리 포함)를 해제합니다. 그래서 당신은 너무 많은 것을 신경 쓰지 않기로 결정할 것입니다. (적어도 생체 내 시간에 한 번만 입력 된 데이터 인 malloc). 당신은 Boehm's conservative garbage collector처럼 garbage collector 사용을 고려할 수도

당신은 valgrind 같은 일부 메모리 누설 감지기를 사용할 수 있습니다 그리고 당신은 모든 경고와 디버그 정보 (예 : gcc -Wall -g)로 컴파일해야하며, BTW (예 : gdb)

을 디버거를 사용 . 그런 다음 strdup 대신 , GC_STRDUP 대신 GC_MALLOC을 사용하면 free 번으로 전화하지 않아도됩니다 (그랬다면 대신 GC_FREE). GC는 일반적으로 접근하기 어려운 메모리를 확보합니다.

+0

OK ... 저는 C에서 매우 익숙하고 "가비지 컬렉터"를 망쳐 놓는 대신에 깨어 있고 메모리를 명시 적으로 해제 할 것입니다. 감사. – ssd

+1

적어도 가비지 콜렉션 * 기술과 용어에 대해 알고 있어야합니다 (적어도 링크 된 위키피지를 읽어야합니다). 또한 디버거와 메모리 누수 감지기를 사용하는 방법을 배우십시오. –

4

"의 malloc"에드 메모리는 암시 적으로 해제 얻을합니까?

아니, 객체를 해제, 당신은 명시 적으로 free이 할당 문은 메모리 누수가 발생하면 malloc

sTmp = sNew; 

으로 할당 메모리에있는

C.

에는 가비지 컬렉터 메커니즘이 없습니다 과제 전에.

1

메모리가 할당되고 포인터가 손실되면 이제 프로그램이 끝날 때까지이 메모리를 해제 할 수 없습니다.

관련 문제