2011-02-04 2 views
2

누군가가 main 이외의 다른 함수 (예 : mymalloc())에 할당 된 메모리를 해제하는 방법을 제안 할 수 있습니까? 프로그램의 다른 기능을 무료로 호출 할 수 있습니까? 또는, 우리는 myalloc()에 메모리를 할당 했으므로, myalloc() 내부에서 메모리를 해제해야합니까? 다음을 구현하는 더 좋은 방법이 있는지 제안하십시오.malloc 및 무료 래퍼 사용


int main(int argc, char ** argv) { 
    int * arr = {0}; 

    foo(); 
    return 1; 
} 

void mymalloc(int ** myarr1) { 
    (*myarr1) = (int*) malloc(sizeof(int)*25); 
    (*myarr1)[3] = 69; 
} 

void myfree(int ** myarr2) { 
    if (*myarr2) { 
    memset(*myarr2, 0, sizeof(int)*25); 
    free(*myarr2); 
} 

void foo() { 
    int * arr1 = {0}; 

    mymalloc(&arr1); 
    printf("car[3]=%d\n",arr1[3]); 
    myfree (&arr1); 

    // Check if memory was freed 
    if (arr1) { 
    printf("ERROR: Memory allocated to arr1 is not freed."); 
    exit (1); 
    } 
} 

출력 :
ERROR : arr1에 할당 된 메모리가 해제되지 않습니다.

+0

'TEST.C : 20 : 오류 : 선언되지 않은'(먼저이 기능에 사용) 'ARR'. – ulidtko

+0

@ulidtko : 고마워. 지금 수정되었습니다. 방금 내가하려고하는 것에 대한 아이디어를주기 위해 코드를 입력했습니다. – MemoryLeak

+1

사실, 보안 코드를 작성하지 않는 한'free'를 사용하기 전에 메모리를 지울 필요가 없습니다. –

답변

1

동일한 기능에서의 malloc 무료로 전화 할 필요가 없습니다,하지만 난 당신의 코드에 대한 몇 가지 발언이 :

  1. 왜 별도의 기능을 사용할 수 있습니까?
  2. myfree의 memset이 쓸모 없으며 포인터가 어쨌든 무효화됩니다.
  3. 포인터에 {0}을 할당하는 것은 쓸모가 없습니다. 왜냐하면 malloc이 이것들을 어쨌든 덮어 쓸 것이기 때문입니다.
+0

@Patrik : 필자는 코드에서 malloc을 여러 번 호출 할 것이므로 main()을 깨끗하고 짧게 유지하여 개별 기능을 유지하려고했습니다. 그리고 변수를 초기화하지 않으면 컴파일러가 질식합니다. 내 질문에 대해 명확하게 다른 변수 이름으로 코드를 업데이트했습니다. 위의 코드는'foo'에서'arr1'에 할당 된 메모리를 해제합니까? 또는'malloc '이'mymalloc'에서'myarr1'에 대해 수행 되었기 때문에'myarr1'을 해제해야합니까? – MemoryLeak

+0

게시물이 변경되었지만 메모리를 마커 값으로 memsetting하기 전에 오버런 버그를 추적하는 데 유용 할 수 있습니다. –

+0

@ Martin : 감사합니다 마틴. 그것은 내가 처음에 그곳에 가지고있는 의도였습니다. 나는 Patrik의 발언에 대해 언급 한 주요 질문에 집중할 수 있도록 방금 제거했다. – MemoryLeak

2

freemalloc으로 만들 수있는 모든 항목이 프로그램에 있습니다.

malloc으로 할당 된 메모리는 메모리의 "힙 (heap)"섹션에서 가져 오며 free과 함께 릴리스되지 않는 한 프로그램의 수명 내내 지속됩니다.

0

메모리가 올바르게 해제되었지만 무료 호출로 포인터가 null로 설정되지 않으면 포인터가 여전히 유효하지 않은 주소를 가리키고 있습니다. 무료로 arr1에 무언가를 써보려고하면 arr1이 null을 가리키고 있지 않더라도 세그먼트 화 오류가 발생합니다. 당신은 항상 null로 포인터를 설정해야하는 이유입니다

바로 해방 후 그것을