Освобождение массивов указателей - PullRequest
2 голосов
/ 29 сентября 2019

Предположим, у меня есть следующая функция main:

int main(void) {
    char * strings[] = { "a", "b", "c", NULL};
    char **xstrings = malloc (4 * sizeof *xstrings);
}

Как правильно free строки xstrings?Примеры:

free(xstrings)

Или:

    while (*xstrings) {  
        free (*xstrings);    
        *xstrings++ = NULL;  
    }
}

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

1 Ответ

4 голосов
/ 29 сентября 2019

Первый пример верен, хотя строка

char * strings[] = { "a", "b", "c", NULL};

не используется.

#include <stdio.h>
#include <stdlib.h>

int main() {
    char **xstrings = malloc(4 * sizeof *xstrings);
    free(xstrings);
    return 0;
}

Выше мы выделяем место для 4 char * указателей и правильно освобождаем память.

Как правило, мы бы хотели выделить память для каждого из char * указателей (мы не сможем достичь ничего значимого, если переменная xstrings в конечном итоге не укажет на некоторые данные):

#include <stdio.h>
#include <stdlib.h>

int main() {
    int len = 4;
    char **xstrings = malloc(len * sizeof *xstrings);

    for (int i = 0; i < len; i++) {
        xstrings[i] = malloc(sizeof(*xstrings[i]) * some_length);
    }

    /* ... do something with the memory ... */

    /* free each xstring element */

    for (int i = 0; i < len; i++) {
        free(xstrings[i]);
    }

    free(xstrings);
    return 0;
}

Линии

while (*xstrings) {  
    free (*xstrings);    
    *xstrings++ = NULL;  
}

не имеют особого смысла.Когда память free d, она не может быть использована.Вы можете использовать временные переменные для достижения этой цели, но это будет немного болезненно по сравнению с простым использованием цикла for (мы не хотим отказываться от исходного указателя xstrings, поэтому мы можем его освободить позже, и мынужна временная переменная в цикле для вызова free после перемещения указателя вперед).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...