Свободная память в C (не может исправить утечку памяти)

#c #arrays #memory #pointers #malloc

#c #массивы #память #указатели #malloc

Вопрос:

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

В настоящее время я пишу программу на 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); 
  

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

Спасибо!

Комментарии:

1. Почему вы используете malloc argc 1 для массива? Вам нужно только argc время. Также ваш while цикл удаления нарушен. Всегда подсчитывайте размер массива.

Ответ №1:

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

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

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

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

  • *(argv i) то же argv[i] самое, что и .

Комментарии:

1. Я изменил код в соответствии с вашими (и другими) предложениями, но у меня все еще происходит утечка памяти. Причина, по которой я использую argc 1, заключалась в добавлении нулевого элемента для отслеживания конца массива, поскольку для назначения мне не разрешалось использовать цикл с argc в качестве счетчика. Извините за путаницу, я отредактировал свой пост, чтобы соответствовать моему текущему коду.

Ответ №2:

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

Добавить

 char ** array_iter = array;
  

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

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

Ответ №3:

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

Ответ №4:

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

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