c - 这是释放作为结构一部分的多个动态分配的数组的正确方法吗?
问题描述
我正在研究读取二进制文件的 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);
提前致谢!
解决方案
我假设填充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 次。
推荐阅读
- c - 在 C 中处理具有相同成员名称但数据类型不同的两个结构
- machine-learning - for 循环在这里如何工作?
- android - 在某些设备上不工作时隐藏状态栏
- c# - 计算操作系统中的线程总数(Windows/Linux)
- google-apps-script - 程序似乎只在不在 Google Apps 脚本中调试时挂起
- python-3.x - 我正在使用 JIRA Python API 创建问题
- python - 使用 Python 电子邮件导入的属性错误
- python - Python:如何从字符串中生成单词列表并根据它们的索引将其保存在文本文件中?
- python - CMake 不显示版本
- javascript - 显示来自 php 函数的 ajax 响应错误