2014-01-08 253 views
2

我有這樣的功能:內存泄漏 - g_strndup

char *getCharVal(const char *ch, const char *att, size_t size) 
{ 
    CHECK_NULL(ch); 
    CHECK_NULL(ch = strstr(ch, att)); 
    ch += strlen(att); 
    char *end = strchr(ch, '"'); 
    CHECK_NULL(end); 
    char *endTag = strstr(ch, ENDTAG); 
    CHECK_NULL (endTag); 
    if (end > endTag) { 
     return NULL; 
    } 
    size_t valSize = end - ch; 
    if (valSize > size) { 
     return NULL; 
    } 
    return g_strndup(ch, valSize); 
} 

這似乎導致內存泄漏。我想,無論如何,我不會釋放mallocated內存。 我不知道如何解決這個問題。從Valgrind的輸出。這裏 :

==9556== 2,996 bytes in 428 blocks are definitely lost in loss record 272 of 301 
==9556== at 0x4A21370: malloc (vg_replace_malloc.c:291) 
==9556== by 0x4B5AA95: g_malloc (in /opt/gnome/lib64/libglib-2.0.so.0.800.6) 
==9556== by 0x4B6CB48: g_strndup (in /opt/gnome/lib64/libglib-2.0.so.0.800.6) 
==9556== by 0x402376: getCharVal (c2.c:244) 
==9556== by 0x403381: processXML (c2.c:408) 
==9556== by 0x4039C6: main (c2.c:558) 
+0

無論被調用'getCharVal()'未釋放的(返回)動態分配的內存。請顯示調用'getCharVal()'的代碼以獲取更多信息。 – trojanfoe

回答

3

g_strndup分配存儲新塊的字符串並將其返回。完成後,您必須在返回的指針上撥打g_free()

例如:

gchar *str = getCharVal(...); 
/* use str */ 
g_free(str)