从GPtrArray提取数据指针

问题描述 投票:0回答:3

我使用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()元素?

c linux glib
3个回答
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(),使事情更快一点。


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);

-1
投票

它不一定是真正的回调函数会破坏内存。如果你的指针是GObjects,GArrays等,并使用破坏* _unref通话功能则只会摧毁具有零引用计数的内存。您可以从堆栈中使用* _ref调用,以确保它不被破坏,从而弹出。不需要任何凌乱的存储和免费的功能覆盖,这是一个很大整洁和内存的安全。

© www.soinside.com 2019 - 2024. All rights reserved.