Освобождение структуры, созданной с помощью malloc, членом которой также был malloc - PullRequest
0 голосов
/ 29 ноября 2018

Допустим, у меня есть struct для реализации векторов в C следующим образом:

struct cvector {
    unsigned int size;     // indicates number of element in the vector
    unsigned int capacity; // indicates length of the array
    int* data;             // array to store the actual data
};
typedef struct cvector* cvector;

Затем я создаю этот вектор следующим образом:

cvector cvector_create() {
    cvector retval = (cvector)malloc(sizeof(struct cvector));
    retval->capacity = 8;
    retval->size = 0;
    retval->data = (int*)malloc(retval->capacity * sizeof(int));

    return retval;
}

Я использую mallocкак для выделения памяти для структуры, так и для выделения памяти для внутреннего int массива.

Для освобождения моего cvector я использую это:

void cvector_free(cvector vector) {
    free(vector);
}

Мой вопрос:Мне нужно отдельно освободить внутренний массив int, например, так: free(vector->data) или освобождает только struct, достаточно?

1 Ответ

0 голосов
/ 29 ноября 2018

Да, вам нужно free также vector->data, правило: один вызов free за каждый вызов malloc

, если вы находитесь под C99, вы можете использовать гибкий массивчлены:

struct cvector {
    unsigned int size;     // indicates number of element in the vector
    unsigned int capacity; // indicates length of the array
    int data[];            // array to store the actual data
};

Обратите внимание, что int data[]; должен быть последним членом struct.

Затем вы резервируете место следующим образом:

cvector cvector_create() {
    cvector retval = malloc(sizeof(struct cvector) + (sizeof(int) * 8));
    retval->capacity = 8;
    retval->size = 0;
    return retval;
}

Теперь достаточно вызвать free(vector), поскольку vector и vector->data находятся в одном блоке.

...