2015-01-08 5 views
5

Linux에서 Boehm 가비지 컬렉터를 GLib와 통합하려고하지만, 한 가지 경우로 메모리를 확보하지 못하는 것으로 나타났습니다. g_strsplit을 여러 번 호출하면 메모리와 segfault가 부족합니다. 가비지 컬렉터 용 README는 동적 라이브러리 내부에서 포인터를 찾는 데 어려움이있을 수 있으며 GC_add_roots를 사용해야 할 수도 있다고 경고했습니다.glib에서 가비지 콜렉션을 사용할 때 메모리 누수가 발생했습니다.

이것을 테스트하기 위해 GLib의 모든 관련 코드를 libglib-2.0.so와 연결하지 않고 원본 파일에 복사했습니다. 이것은 segfault를 제거했는데, 이것은 정말로 이것이 문제라고 말해줍니다. 그러나 GC_add_roots를 사용하여이를 해결하는 방법에 대한 문서는 없습니다. 누군가 나를 도울 수 있습니까? 여기

메모리 누수가 발생하는 코드입니다 :이 현대 입심을 사용하여 입심 수준에서 작업을 얻을 수있는 방법은 없습니다

#include <glib.h> 
#include <gc.h> 

void no_free(void *mem) {} 

int main() { 
    g_mem_gc_friendly = TRUE; 

    GMemVTable memvtable = { 
     .malloc  = GC_malloc, 
     .realloc  = GC_realloc, 
     .free  = no_free, 
     .calloc  = NULL, 
     .try_malloc = NULL, 
     .try_realloc = NULL 
    }; 

    g_mem_set_vtable(&memvtable); 

    for (int i = 0; i < 10000; i++) { 
     char **argv = g_strsplit("blah", " ", 0); 
     argv[0][0] = 'a'; // avoid unused variable warning 
    } 

    return 0; 
} 

답변

1

입심 2.46, g_mem_set_vtable() does nothing 이후, 그래서. GLib은 g_malloc(), g_new() 등을 호출 할 때 libc의 할당자를 무조건 사용합니다. g_slice_*()을 명시 적으로 사용할 때 자신의 GSLice 할당자를 계속 사용하지만 libc 할당 자의 블록 할당도 요청합니다.

가비지 수집기를 libc 레벨에서 통합하려고 시도하는 것이 좋습니다. 실질적으로 GMemVTable과 같지만 GLib 레벨 대신 glibc 레벨에서 glibc’s malloc hooks을 사용하여 구현하는 방법은 an old article입니다. 나는 이것을 시도하지 않았다, 그래서 나는 그것이 실제로 얼마나 잘 작동하는지 모른다.