Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从GPtrArray提取指向数据的指针_C_Linux_Glib - Fatal编程技术网

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()设置callback
g_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()
来加快速度