我使用GPtrArray
结构来保存指向动态分配的内存块。正如我需要尽可能的存储器可能与正确的释放作为简单的I设置回调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
}
问题是,文件说,任何g_ptr_array_remove()
,g_ptr_array_remove_index()
,g_ptr_array_remove_fast()
,g_ptr_array_remove_index_fast()
通过如果它被设置调用回调破坏元素的内存。正如你看到的我已经设置回调。
那么,一般我怎么能做到这一点?我怎样才能指针像删除该指针的任何提及来自阵列,但没有释放元素的内存g_ptr_array_index()
元素?
由于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()
,使事情更快一点。
你可以做:
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等,并使用破坏* _unref通话功能则只会摧毁具有零引用计数的内存。您可以从堆栈中使用* _ref调用,以确保它不被破坏,从而弹出。不需要任何凌乱的存储和免费的功能覆盖,这是一个很大整洁和内存的安全。