Это правильный способ освобождения нескольких динамически распределенных массивов, которые являются частью структуры? - PullRequest
0 голосов
/ 11 мая 2018

Я работаю над кодом C, который читает в двоичных файлах и организует данные, содержащиеся в этих файлах, в структуру перед обработкой.В своей самой краткой форме основная функция структурирована следующим образом: 1) read_hgf_file 2) process_contents 3) free_allocated_memory

Поскольку данные состоят из записей в разных точках пространства, наиболее удобным является организация данных вструктура с массивами.Я включил определение этой структуры в заголовочный файл «read_hgf.h», который выглядит следующим образом (я использую MSVS 2017):

#pragma once
struct HGF {
    int32_t Nrows;
    int32_t Ncols;
    int32_t Np;
    float *data;
    float *xcoords;
    float *ycoords;
    float *zcoords;
};

Первые три поля помогают определить размерпоследние четыреВ моей основной функции я вызываю функцию, которая заполняет эти поля данными из двоичного файла, что прекрасно работает.Теперь я хочу освободить динамически выделенную память, связанную с этой структурой.Поскольку это выглядит беспорядочно, если я освобождаю эти массивы один за другим в основной функции, я хочу обернуть эту функцию в функцию free_hgf ().Правильно ли я понял, что я должен освободить эти поля один за другим, как они объявлены?Будет ли следующий способ правильным, или я нарушаю какие-либо правила C / лучшие практики (особенно связанные с сочетанием операторов * и ->)?

функция:

#include "read_hgf.h"
void free_hgf(struct HGF **hgf) {
free((*hgf)->zcoords);
free((*hgf)->ycoords);
free((*hgf)->xcoords);
free((*hgf)->data);
*hgf = NULL;

}

Вызывается с основного номера следующим образом:

#include "read_hgf.h"
struct HGF hgf;
struct HGF *hgfPtr = &hgf;
free_hgf(&hgfPtr);

Заранее спасибо!

1 Ответ

0 голосов
/ 11 мая 2018

Я предполагаю, что функция, которая заполняет структуру HGF, написана вами, а членам структуры HGF присвоено malloc, как

void read_hgf(struct HGF * hgf)
{
    ...

    hgf->data = malloc(...);
    hgf->xcoords = malloc(...);
    hgf->ycoords = malloc(...);
    hgf->zcoords = malloc(...);

    ...
}

Использование структуры будет

struct HGF hgf;

read_hgf(&hgf);

...

free_hgf(&hgf);

и освобождающая часть,

void free_hgf(struct HGF * hgf) // single pointer is enough to pass a structure
{
    free(hgf->zcoords);
    free(hgf->ycoords);
    free(hgf->xcoords);
    free(hgf->data);

    // clear members
    hgf.data = NULL;
    ...
}

Помните, если вы выделяли память N раз (с помощью malloc, realloc, ...), после того, как вы их закончили, вы должны вызывать free N раз.

...