C 从GPtrArray提取指向数据的指针
我使用C 从GPtrArray提取指向数据的指针,c,linux,glib,C,Linux,Glib,我使用GPtrArray结构来保存指向动态分配内存块的指针。由于我需要尽可能简单和正确地释放内存,我使用_free_func()设置callbackg_ptr_array\u new_,它将释放指针数组的一个元素。因此,当我为数组的所有元素调用g\u ptr\u array\u free()时,称为回调,它正确地释放了分配的内存。下面是一些描述问题的伪代码: ... GPtrArray *stack = g_ptr_array_new_with_free_func(pt_free_stack_e
GPtrArray
结构来保存指向动态分配内存块的指针。由于我需要尽可能简单和正确地释放内存,我使用_free_func()设置callbackg_ptr_array\u new_,它将释放指针数组的一个元素。因此,当我为数组的所有元素调用g\u ptr\u array\u free()
时,称为回调,它正确地释放了分配的内存。下面是一些描述问题的伪代码:
...
GPtrArray *stack = g_ptr_array_new_with_free_func(pt_free_stack_element);
if(...) {
...
g_ptr_array_free(stack);
...
}
if(interrupt) {
// Here I need to do something like pop() for stack
// I want to get pointer at some allocated element,
// and remove it from stack, but without freeing
// memory of this element
}
问题是文档中说,任何g\u ptr\u array\u remove()
,g\u ptr\u array\u remove\u index()
,g\u ptr\u array\u remove\u fast(),g\u ptr\u array\u remove\u index\u fast(),都可以通过调用callback(如果已设置)来销毁元素的内存。正如你看到的,我已经设置了回调
将军,我怎么能做到?如何在不释放元素内存的情况下,从数组中删除任何有关该指针的内容,从而获得指向元素的指针,如g\u ptr\u array\u index()
g_ptr_array_set_free_func(stack, null);
p = g_ptr_array_index(stack, i);
g_ptr_array_remove_index(stack, i);
g_ptr_array_set_free_func(stack, pt_free_stack_element);
回调函数不一定会破坏内存。如果您的指针指向GObjects、GArrays等,并使用*\u unref调用的destroy函数,那么它将只销毁ref计数为零的内存。因此,您可以使用*\u ref调用从堆栈中弹出,以确保它不会被破坏。
无需对自由函数进行任何杂乱的存储和覆盖,而且更整洁、内存更安全。自从GLib 2.58以来,您可以使用它,它就是为了这个原因而添加的
p = g_ptr_array_steal_index (stack, i);
…
pt_free_stack_element (p);
如果阵列不需要保持有序,可以使用g\u ptr\u array\u steal\u index\u fast()
来加快速度