2011-10-14 3 views
3

EDIT : 사람들이 만든 제안에 따라 프로그램을 변경했지만 메모리 누수 문제를 해결할 수 없습니다. 또한, argc를 사용하지 않고 그것들을 해제 할 필요가 있으므로 배열의 길이를 어떻게 든 추적해야하므로 마지막 요소를 null로 표시했습니다.C의 여유 메모리 (메모리 누출 문제를 해결할 수 없음)

현재 동적으로 할당 된 배열에 명령 줄 인수를 복사하는 C 프로그램을 작성하고 있습니다.

char** array_copy = array; 
while(*array_copy != NULL){ 
    free(*array_copy++); 
} 
free(*array_copy) // free the null at the end 
free(array); 

그러나, 나는 여전히 메모리 누수를 얻을 :

char **array;                                              
int j;                                               

array = malloc(sizeof(char*) * (argc + 1));                                      
int i;                                                
int index = 0;                                              

for(i = 0; i < (argc); i++){                                          
    int length = strlen(*(argv + i));                                        
    array[i] = malloc((length + 1) * sizeof(char));                                                                                  
     // Cycle through all the chars and copy them in one by one                                 
    for(j = 0; j <= length; j++){                                         
     array[i][j] = toupper(argv[i][j]);                                       
    }                                                
}  
array[i + 1] = NULL;                                               

return array;  

나중에, 내가 메모리를 해제하려고 :처럼 내 코드 보인다. 나는 내가 뭘 잘못하고 있는지 잘 모르겠습니다. 누군가가 나에게 멋진 팁을 줄 수 있다면.

감사합니다.

+0

왜 배열에 대해'argc + 1'을 malloc합니까? 'argc' 만 필요합니다. 또한 'while'루프가 삭제되었습니다. 배열 크기를 항상 계산하십시오. – pmr

답변

6

마지막 줄 free(array)은 내용을 해제 할 때 array으로 증가 했으므로 원래 malloc을 해제하지 않습니다. 또한

(다른 사람들이 지적으로) :

  • 루프는 비제로 확인되는 배열의 내용을 자유롭게,하지만 당신은 요소로 시작하는 제로되어 있는지 확인하지 않습니다.

  • argc 만 필요할 때 배열에 argc + 1 요소를 할당합니다.

  • *(argv + i)argv[i]과 동일합니다.

+0

나는 (그리고 다른 사람들의) 제안에 따라 코드를 변경했지만 여전히 메모리가 누출됩니다. argc + 1을 사용하는 이유는 할당을 위해 배열 끝을 추적하기 위해 null 요소를 추가하는 것이 었습니다. argc와 함께 루프를 카운터로 사용할 수 없었기 때문입니다. 혼란에 죄송합니다, 내 현재 코드와 일치하도록 내 게시물을 편집했습니다. – Matt

+0

아, 이제는 고마워 해. 감사합니다. – Matt

2

array 완전히 ++ '처음 오프 거라고되었다. free(array)은 힙을 손상시키고 해제하지 않습니다.

char ** array_iter = array; 

을 추가 한 다음

while(*array_iter){ 
    free(*array_iter++); 
} 
free(array); 
0

귀하의 while 루프가 작동하지 않습니다에 루프를 변경합니다. 먼저 char*에 대해 argc 시간의 공간 만 할당하십시오. 그런 다음 각 문자열 (널 종결 자)에 strlen + 1을 할당하면 strcpy을 사용하여 문자열을 복사하고 나중에 대문자로 복사합니다 (오류가 발생하지 않음). 당신은 원래 무엇인지 이외의 동일한 포인터를 설정하고, 이후 증가를 사용하여

for(int i = 0; i < argc; ++i) free(array[i]); 
2

: 다음과 같은 free 있습니다. 더 이상 올바른 기억을 풀지 않습니다.