Свободная память в C (не удается устранить утечку памяти) - PullRequest
4 голосов
/ 15 октября 2011

РЕДАКТИРОВАТЬ: я изменил свою программу в соответствии с предложениями, которые люди сделали, но я не могу исправить утечки памяти.Кроме того, мне нужно освободить их без использования argc, поэтому мне нужно каким-то образом отслеживать длину массива, чтобы я пометил последний элемент как нулевой.

В настоящее время я пишу программу на C, которая копирует аргументы командной строки в динамически размещаемый массив.Мой код выглядит так:

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;      

Позже я пытаюсь освободить память:

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

Тем не менее, я все еще получаю утечки памяти.Я не совсем уверен, что я делаю не так.Если бы кто-нибудь мог дать мне советы, это было бы здорово.

Спасибо!

Ответы [ 4 ]

6 голосов
/ 15 октября 2011

Ваша последняя строка free(array) не освобождает ваш исходный malloc, потому что вы увеличили array при освобождении его содержимого.

Также (как указывают другие):

  • ваш цикл освобождения содержимого массива проверяется на ненулевое значение, но вы не гарантируете, что элементы начинаются с нуля.

  • ВыВыделите argc + 1 элемент в массиве, когда вам нужен только argc.

  • *(argv + i) совпадает с argv[i].

2 голосов
/ 15 октября 2011

Используя постинкремент, вы устанавливаете указатель равным чему-то другому, чем он был изначально.Вы больше не освобождаете нужную память.

2 голосов
/ 15 октября 2011

array было полностью ++ от начала. free(array) разрушает вашу кучу, а не освобождает.

добавить

char ** array_iter = array;

, а затем измените цикл на

while(*array_iter){
    free(*array_iter++);
}
free(array);
0 голосов
/ 15 октября 2011

Ваш цикл while не работает.Сначала выделите argc раз для char*.Затем выделите strlen + 1 для каждой строки (нулевой терминатор), используйте strcpy для копирования строк и их последующего ввода в верхнем регистре (меньше подвержено ошибкам).Тогда имейте free как это:

for(int i = 0; i < argc; ++i) free(array[i]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...