c - How can I free all mallocated keys and values? -


संपादित करें

मैं इस तरह gtith बना देता हूं:

  gtree * T = g_tree_new_full ((GCompareDataFunc) g_ascii_strusecmp, NULL, free_data, free_data);  

मेरे पास मुफ्त कार्य है:

  शून्य मुक्त_डेटा (gpointer डेटा) {निशुल्क (डेटा); }  

मैं इस तरह से सामग्री डालें:

  इंट होल इनस्ट्रॉमेंटेललाइस्ट (GTree * पेड़) {printf ("HoleInstrumentenListe \ n"); FILE * fp = fopen ("cfg / InstrumentList_FULL.csv", "आरबी"); Char * line = NULL; Size_t len ​​= 0; Ssize_t पढ़ा; Int * pQotStatus; If (fp == NULL) {printf ("Konnte Instrumentenliste nicht laden \ n"); निकास (FAILLoadInstrumentList); } जबकि ((read = getline (& amp; line, & amp; len, fp)) = -1) {char * p1; Int * p2 = malloc (sizeof (इंट)); P1 = स्ट्रॉटोक (रेखा, "|"); * पी 2 = एटॉय (स्ट्रॉटोक (NULL, "|")); यदि ((pQotStatus = (int *) g_tree_lookup (पेड़, पी 1)) = = नल) {* p2 = (* pQotStatus | (1 & lt; (* p2-1)); } और {* p2 = (1 & lt; & lt; (* p2-1)); } G_tree_inert (वृक्ष, (gpointer) g_strdup (p1), (gpointer) p2); } Fclose (fpose); वापसी 1; }  

मैं इस तरह पेड़ को नष्ट कर देता हूं:

  g_tree_destroy (t);  

मुझे अभी भी मेमोरी लीक है।

कुछ वाल्जइंड आउटपुट:

  == 4828 == 1 ब्लॉक में 1,024 बाइट अभी भी हैं हानिकारक रिकॉर्ड में 4 260 == 4828 == 0x4A21370 पर: malloc (vg_replace_malloc.c: 291) == 4828 == 0x4B5AA95: g_malloc (/opt/gnome/lib64/libglib-2.0.so.0.800.6 में) ) == 4828 == 0x4B5BC59: g_mem_chunk_alloc (/opt/gnome/lib64/libglib-2.0.so.0.800.6 में) == 4828 == 0x4B733D5 द्वारा: ??? (/opt/gnome/lib64/libglib-2.0.so.0.800.6 में) == 4828 == 0x4B73609 द्वारा: ??? (/opt/gnome/lib64/libglib-2.0.so.0.800.6 में) == 4828 == 0x4B735D6 द्वारा: ??? (/opt/gnome/lib64/libglib-2.0.so.0.800.6 में) == 4828 == 0x4B735D6 द्वारा: ??? (/opt/gnome/lib64/libglib-2.0.so.0.800.6 में) == 4828 == 0x4B73511 द्वारा: ??? (/opt/gnome/lib64/libglib-2.0.so.0.800.6 में) == 4828 == 0x4B73511 द्वारा: ??? (/opt/gnome/lib64/libglib-2.0.so.0.800.6 में) == 4828 == 0x4B736BA: g_tree_inert (/opt/gnome/lib64/libglib-2.0.so.0.800.6 में) == 4828 == 0x401037: HoleInstrumentenListe (unzipper_m.c: 101) == 4828 == द्वारा 0x401879: मुख्य (unzipper_m.c: 396)  

रेखा 101 है

  g_tree_inert (वृक्ष, (gpointer) g_strdup (p1), (gpointer) p2);  

जो ऊपर है उसके लिए आप वास्तव में रिसाव करेंगे, क्योंकि आप कुंजी को दो बार कॉपी करते हैं ( strdup (g_strdup (p1)) )। बाहरी strdup से छुटकारा पाएं, इसलिए आपके पास g_strdup (p1)

उस बिंदु पर, आपको केवल दोनों कुंजी और मूल्यों को g_free की आवश्यकता होगी, जो कि ' करने के लिए कड़ी मेहनत नहीं करते (आप केवल जी_फ्री को कुंजी_डेस्टॉय_फंक और value_destroy_func तर्क दोनों के पास पास करते हैं):

  gtree * t = g_tree_new_full (key_compare_func, NULL, g_free, g_free);  

हालांकि, क्योंकि आपके मान पूर्णांक हैं, आप वास्तव में उपयोग करके malloc से बच सकते हैं और उस स्थिति में, आप इस तरह से कुछ के साथ समाप्त होगा:

  gint key_compare_func (gconstpointer a, gconstpointer b) {रिटर्न g_strcmp0 ((const char *) a, (const char *) ख) ; } Int readFilec (GTree * पेड़) {FILE * fp = fopen ("cfg / InstrumentList_FULL.csv", "rb"); Char * line = NULL; Size_t len ​​= 0; Ssize_t पढ़ा; Gtree * t = g_tree_new_full (key_compare_func, NULL, g_free, NULL); यदि (fp == NULL) बाहर निकलें (EXIT_FAILURE); जबकि ((पठन = गेटलाइन (& amp; रेखा, & amp; len, fp))! = -1) {char * p1; इंट पी 2; Printf ("% s", रेखा); P1 = स्ट्रॉटोक (रेखा, "|"); पी 2 = एटॉय (स्ट्रॉटोक (NULL, "|")); G_tree_inert (वृक्ष, (gpointer) g_strdup (p1), GINT_TO_POINTER (p2)); // ट्रिएड (& amp; रूट, स्ट्रडअप (पी 1), पी 2); Printf ("-% s% d", पी 1, पी 2); } // बाहर निकलें (EXIT_SUCCESS); }  

Comments

Popular posts from this blog

ios - How do I use CFArrayRef in Swift? -

eclipse plugin - Run java code error: Workspace is closed -

c - Error on building source code in VC 6 -