[英]Free array of pointers in C
我使用 C 在 Eclipse 环境中工作。为了简单地解释事情,我有一个简单的结构来定义我的项目中所需的一些元素:
typedef struct adc adc_def;
struct adc {
SPI_HandleTypeDef *spi_hal;
//Adresse de l'esclave avec qui communiquer
uint8_t numero_adc;
registres_adc config;
};
我还有一个函数实例化一个新的结构(之前声明的那个)。 我需要其中的 4 个,我将它们存储在一个全局数组中:
adc_def* adc_new(SPI_HandleTypeDef *param_spi_hal, uint8_t numero_adc) {
adc_def *adc = NULL;
registres_adc tmp_config;
adc_status_t status_adc;
if ((NULL != param_spi_hal) && numero_adc <= ADC_MAX) {
if (NULL != (adc = malloc(sizeof(adc_def)))) {
adc->spi_hal = param_spi_hal;
adc->numero_adc = numero_adc;
adc->config.configuration = DEFAULT_CONF;
//Copie des tab en const pour les passer dans la fonction
memcpy(adc->config.hpf, HPF, 2);
memcpy(adc->config.fsc, FSC, 3);
memcpy(adc->config.ofc, OFC, 3);
if (HAL_OK != adc_stopCont(adc)) {
free(adc);
adc = NULL;
}
///////////
if (HAL_OK != adc_setConfig(adc, adc->config)) {
free(adc);
adc = NULL;
}
}
}
return adc;
}
进入主程序后,我将其中 4 个存储在全局数组中:
SPI_HandleTypeDef hspi1;
adc_def *adc_present[4];
void re_init(){
for (int z = 0; z < 4; z++) {
free(adc_present[z]);
adc_present[z] = NULL;
}
for (int a = 0; a < 4; a++) {
adc_present[a] = adc_new(&hspi1, a+1);
}
}
int main(void) {
for (int a = 0; a < 4; a++) {
adc_present[a] = adc_new(&hspi1, a+1);
}
re_init();
}
在我的程序中,我需要释放存储在 adc_present 中的所有结构体,以再次重新创建其他 adc_def 结构体元素。 因此,我为此执行此代码:
看起来这段代码会引起内存泄漏和错误,即使我以前使用过免费,我也无法在此选项卡中重新生效。 我错过了什么吗? 标签在这里没有被正确释放? 我有一个动态分配的指针数组,在重新影响它们之前我释放了它们,我不明白
一个问题是在这段代码中:
if (HAL_OK != adc_stopCont(adc)) {
free(adc);
adc = NULL;
}
///////////
if (HAL_OK != adc_setConfig(adc, adc->config)) {
free(adc);
adc = NULL;
}
如果对adc_stopCont()
的调用失败,则将adc
设置为NULL
adc = NULL;
但无论如何调用adc_setConfig()
:
if (HAL_OK != adc_setConfig(adc, adc->config)) {
如果adc
是NULL
,那将会失败,因为adc->config
将尝试取消引用一个NULL
指针。
这样会好很多:
if (HAL_OK != adc_stopCont(adc)) {
free(adc);
adc = NULL;
}
else if (HAL_OK != adc_setConfig(adc, adc->config)) {
free(adc);
adc = NULL;
}
或者
if (HAL_OK != adc_stopCont(adc)) {
free(adc);
return(NULL);
}
if (HAL_OK != adc_setConfig(adc, adc->config)) {
free(adc);
return(NULL);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.