为全局结构分配内存并释放它的问题



我正在使用带有 FreeRTOS 的嵌入式板。

在一个任务中,我定义了两个结构,并使用pvPortMalloc来分配内存。(一个结构是另一个结构中的成员)

此外,我将结构的地址传递给某些函数。

但是,使用vPortFree释放内存存在一些问题。

以下是我的代码(test_task.c):

/* Struct definition */
typedef struct __attribute__((packed)) {
uint8_t  num_parameter;
uint32_t member1;
uint8_t  member2;
uint8_t  *parameter;
}struct_member;
typedef struct __attribute__((packed)) {
uint16_t num_member; 
uint32_t class;
struct_member *member;
}struct_master;

我在下面定义了一个全局结构和一个数组。

uint8_t       *arr;
struct_master master:

函数定义:

void decode_func(struct_master *master, uint8_t *arr) 
{
master->member = pvPortMalloc(master->num_member);
for(int i = 0; i < scr->num_command; ++i){
master->member[i].parameter = pvPortMalloc(master->member[i].num_parameter);
do_something();
}  
}

操作任务如下所示。

在任务结束时,我想释放内存:

void test_task()
{
decode_func( &master, arr);
do_operation(); 

vPortFree(master.member);
for (int i = 0; i < master.num_member; ++i)
vPortFree(master.member[i].parameter);
hTest_task = NULL;
vTaskDelete(NULL);    
}

免费master.member是可以的.

但是,当程序尝试免费master.member[i].parameter时, 似乎之前已经执行过释放,软件会自动重置。

有谁知道为什么会这样?

乍一看,您为成员分配的方式在decode_func中是错误的。

我假设master->num_member表示master应包含的struct member数。

master->member = pvPortMalloc(master->num_member);

应更正为,

master->member = pvPortMalloc(master->num_member * sizeof(struct_member));

同样,在相同的函数中,循环似乎也有点可疑。

for(int i = 0; i < scr->num_command; ++i){
master->member[i].parameter = pvPortMalloc(master->member[i].num_parameter);
do_something();
} 

我不确定src->num_command表示什么,但自然而然地我认为循环应该执行到i < master->num_member.我假设您的循环也应该更新如下,

for(int i = 0; i < master->num_member; ++i){
master->member[i].parameter = pvPortMalloc(master->member[i].num_parameter * sizeof(uint8_t));
do_something();
} 

释放内存时,请确保在释放容器结构之前先释放包含的成员。因此,您应该首先释放所有parameter,然后释放member,因此test_task函数中也更改该顺序。

还要确保在执行vTaskDelete(NULL);之前必须释放test_task消耗的所有资源,否则将出现资源泄漏。vTaskDelete(NULL)将简单地将该特定任务的 TCB 标记为ready to be deleted,以便稍后空闲任务将清除与 TCB 相关的资源。

通常,当您释放对象时,对象的内容将被销毁,您将无法再访问它们。 因此,当您想要释放这样的嵌套分配时,您需要释放内部分配,然后再释放外部(主)分配。 换句话说:

for (int i = 0; i < master.num_member; ++i)
vPortFree(master.member[i].parameter);
vPortFree(master.member);

首先释放参数,然后释放包含成员数组。

相关内容

  • 没有找到相关文章

最新更新