gpt4 book ai didi

c - GArray 元素的可用内存

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:39:59 25 4
gpt4 key购买 nike

我创建 drvm *drv我的功能中的结构。此结构本身包含包含 malloc()-ed 的字段字段(uint32_t *buffer)。执行此操作的代码类似于:

...
size_t elm_size = sizeof(model*);
uint32_t length = *(uint32_t*)len;

GArray *models = g_array_sized_new(FALSE, FALSE, elm_size, length);

model *mod;
for (int i = 0; i < length; ++i) {
mod = create_model(...);
g_array_append_val(models, mod);
}

这段代码没有错误并且经过了严格的测试。在程序开始时,我注册函数 free_all() (通过 atexit() )当 exit() 时应该清理所有资源(尤其是内存)执行。

在这个函数中,我正在尝试释放 elements of GArray* 的内存(model * 结构) GArray * 的内存本身:

GArray *models;
g_array_set_clear_func(models, clean_model);
if(!g_array_free(models, FALSE)) { //OK }

问题是当clean_model(void *data)在里面调用glib库我建议它包含指向一个 model * 的指针元素。但是地址是错误的,它似乎没有指向任何正确的值。都不是 GArray* , 也不 model* .

此外 GArray *modelsfree_all()函数是正确的(与我创建它时相同)并且当我遍历所有 GArray *free_all() 中的元素通过

for (int i = 0; i < len; ++i) {
mod = g_array_index(models, model*, i); // Here I get correct pointer to model*
clean_model(mod);
}

我得到期望值。

问题:怎么了?我应该如何释放 GArray * 元素的内存?如果这些元素包含 malloc()-ed内存?

标题部分:

struct _info {
uint32_t *buffer;
uint32_t len;
};

typedef struct _info info;

struct _prod {
uint32_t *buffer;
uint32_t len;
};

typedef struct _prod prod;

struct _model {
uint32_t name;
prod product;
info inform;
};

typedef struct _model model;

struct _drvm {
GArray *models;
GArray *strings;
};

typedef struct _drvm drvm;

最佳答案

基本上,问题是您的 clean_model 函数被传递给 model** 而不是您期望的 model*

请记住,GArray 用于存储完整的结构,而不仅仅是指向结构的指针。为了做到这一点,它需要将结构的全部内容复制到内部data数组中,因此任何后续指向结构的指针(传递给clean_model ) 将指向 data 中的某处(即 clean_model((elt_type*)&models->data[index * sizeof(elt_type)]) - 其中在你的情况下 elt_typemodel*)

为了解决这个问题,我想到了几个选项,按照(主观)偏好的顺序:

  1. 改用GPtrArray;鉴于您的元素已经动态分配,内存管理/指针处理/类型转换(或缺少)将不那么困惑
  2. clean_model 参数更改为 model**
  3. 使用 GArray 来存储 model 结构而不是指针,但只有当您可以将分配与填充模型内容分开时才有意义,例如g_array_new(FALSE, FALSE, sizeof(model))fill_model(&g_array_index(models, model, i))

在所有情况下,您还应该将 TRUE 传递给 g_array_free,因为您似乎没有将 GArray.data 用于任何事情之后(考虑到您无论如何都要释放其中的所有有用数据,这没有任何意义。)

关于c - GArray 元素的可用内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14684739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com