- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我创建 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 *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;
最佳答案
基本上,问题是您的 clean_model
函数被传递给 model**
而不是您期望的 model*
。
请记住,GArray
用于存储完整的结构,而不仅仅是指向结构的指针。为了做到这一点,它需要将结构的全部内容复制到内部data
数组中,因此任何后续指向结构的指针(传递给clean_model
) 将指向 data
中的某处(即 clean_model((elt_type*)&models->data[index * sizeof(elt_type)])
- 其中在你的情况下 elt_type
是 model*
)
为了解决这个问题,我想到了几个选项,按照(主观)偏好的顺序:
GPtrArray
;鉴于您的元素已经动态分配,内存管理/指针处理/类型转换(或缺少)将不那么困惑clean_model
参数更改为 model**
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/
我想在 GArray 中添加一些字符串对象。但是当我阅读 API 手册时 g_array_new(),它在创建数组时寻找要添加的元素的大小,但是 不同的字符串对象有不同的长度,所以我该如何处理这个问题
当 g_array_append_val() 时会发生什么或 GLib 中的其他附加/前置函数之一,使 GArray 的长度大于 guint (unsigned int) 所能容纳的长度? 文档对此没
我有一些奇怪的 Glib 行为,在互联网上搜索了一下,发现 this Glib tutorial ,第二个代码块要具体: //ex-garray-2.c #include #include //
我创建 drvm *drv我的功能中的结构。此结构本身包含包含 malloc()-ed 的字段字段(uint32_t *buffer)。执行此操作的代码类似于: ... size_t elm_size
我有一个 GValue 的 GArray(全非零),它是在运行时用 g_array_append_val 分配的。我想知道如何找出最后一个元素的索引是什么,或者更准确地说,数组包含多少个元素。代码如下
我正在尝试将字符串映射到 GArrays使用GHashTable 。到目前为止,我还没有成功。 我像这样声明哈希表: hash_table = g_hash_table_new_full(g_str_
编译器说 GHashTable 未定义,但如果我在从数组检索 GHashTable 的代码上方使用它,则显然它已定义。到底是怎么回事?我很困惑。 gcc -Wall -o tht `pkg-confi
这是一个对 GArray 进行排序的练习程序,我使用 sizeof() 来了解数组的大小。 从逻辑上思考,sizeof(x) 应该是 24,即 6 个整数 * 每个整数的大小,即 4 - 6*4。 但
我想使用 glib 库的 GArray 将位置 x 的值设置为给定值。就像我使用 c-array 和 array[x]=5; 为什么我找不到执行此操作的函数?这不就是一个数组的意思吗?文档:https
我正在研究openface 。 Openface有unknown classification python cod e. 我正在测试lfw-classification-unknown.py的训练部
我正在尝试使用 GLib 作为替代方法来编写我自己的数据结构。我的目标是仅使用 glib 编写一个基于邻接表的简单图形数据结构。 现在的代码如下 #include #include struct
我是一名优秀的程序员,十分优秀!