首页 > 解决方案 > 这是释放作为结构一部分的多个动态分配的数组的正确方法吗?

问题描述

我正在研究读取二进制文件的 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;

}

从 main 调用如下:

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

提前致谢!

标签: carrayspointersstructfree

解决方案


我假设填充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, ...),在您使用完它们之后,您必须调用freeN 次。


推荐阅读