我在我的函数中创建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()
(by 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 *models
,free_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;