0

我正在使用GPtrArray结构来保存指向动态分配内存块的指针。由于我需要尽可能简单和正确的内存释放,我设置了回调g_ptr_array_new_with_free_func (),它将释放指针数组的一个元素。因此,当我调用g_ptr_array_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
}

问题是文档说 any g_ptr_array_remove(), g_ptr_array_remove_index(), g_ptr_array_remove_fast(),g_ptr_array_remove_index_fast() 如果设置了回调,则通过调用回调来破坏元素的内存。如您所见,我已设置回调。

好吧,一般我怎么能做到这一点?如何获取指向元素的指针,例如g_ptr_array_index()从数组中删除任何提及此指针的内容,但不释放元素的内存?

4

3 回答 3

1

你可以做:

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);
于 2013-06-21T15:51:25.493 回答
1

从 GLib 2.58 开始,您可以使用g_ptr_array_steal_index(),正是出于这个原因而添加的。

p = g_ptr_array_steal_index (stack, i);
…
pt_free_stack_element (p);

如果数组不需要保持有序,您可以使用它g_ptr_array_steal_index_fast()来加快速度。

于 2019-02-04T14:25:02.730 回答
-1

回调函数不一定会破坏内存。如果您的指针指向 GObjects、GArrays 等并使用 *_unref 调用的破坏函数,那么它只会破坏引用计数为零的内存。因此,您可以使用 *_ref 调用从堆栈中弹出,以确保它不会被破坏。不需要对自由函数进行任何混乱的存储和覆盖,而且它更整洁且内存安全。

于 2019-02-04T01:07:49.240 回答