2013-06-21 3 views
0

동적으로 할당 된 메모리 청크에 대한 포인터를 보유하기 위해 GPtrArray 구조를 사용하고 있습니다. 가능한 한 간단하고 정확한 메모리 해제가 필요하므로 포인터 배열의 한 요소를 해제하는 콜백 g_ptr_array_new_with_free_func()을 설정합니다. 따라서 배열의 모든 요소에 대해 g_ptr_array_free()을 호출하면 할당 된 메모리를 올바르게 해제하는 콜백이 호출됩니다.GPtrArray에서 데이터 추출 포인터

... 
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()과 같은 요소에 대한 포인터를 얻으려면 어떻게해야합니까?

답변

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