2011-01-20 4 views
4

Я новичок в Linux. Как я могу интерпретировать следующий результат отПонимание вывода valgrind

valgrind --tool=memcheck --leak-check=yes ./main 

В нем говорится, что некоторые блоки потеряны. Как я могу скрыть утечки памяти.

==2599== HEAP SUMMARY: 
==2599==  in use at exit: 17,327 bytes in 55 blocks 
==2599== total heap usage: 180,597 allocs, 180,542 frees, 15,787,989,675 bytes allocated 
==2599== 
==2599== 9 bytes in 1 blocks are definitely lost in loss record 5 of 19 
==2599== at 0x4025BD3: malloc (vg_replace_malloc.c:236) 
==2599== by 0x41E546F: strdup (strdup.c:43) 
==2599== by 0x804BA2A: Schema::Schema(char*, char*) (Schema.cc:86) 
==2599== by 0x804AD78: CNF::GrowFromParseTree(AndList*, Schema*, Record&) (Comparison.cc:606) 
==2599== by 0x804EE52: main (main.cc:28) 
==2599== 
==2599== 10 bytes in 2 blocks are definitely lost in loss record 6 of 19 
==2599== at 0x4025BD3: malloc (vg_replace_malloc.c:236) 
==2599== by 0x41E546F: strdup (strdup.c:43) 
==2599== by 0x804BB84: Schema::Schema(char*, char*) (Schema.cc:115) 
==2599== by 0x804AD78: CNF::GrowFromParseTree(AndList*, Schema*, Record&) (Comparison.cc:606) 
==2599== by 0x804EE52: main (main.cc:28) 
==2599== 
==2599== 13 bytes in 1 blocks are definitely lost in loss record 9 of 19 
==2599== at 0x4025BD3: malloc (vg_replace_malloc.c:236) 
==2599== by 0x41E546F: strdup (strdup.c:43) 
==2599== by 0x804BA2A: Schema::Schema(char*, char*) (Schema.cc:86) 
==2599== by 0x804EDF4: main (main.cc:23) 
==2599== 
==2599== 13 bytes in 1 blocks are definitely lost in loss record 10 of 19 
==2599== at 0x4025BD3: malloc (vg_replace_malloc.c:236) 
==2599== by 0x41E546F: strdup (strdup.c:43) 
==2599== by 0x804BA2A: Schema::Schema(char*, char*) (Schema.cc:86) 
==2599== by 0x804EEA4: main (main.cc:37) 
==2599== 
==2599== 188 bytes in 16 blocks are definitely lost in loss record 16 of 19 
==2599== at 0x4025BD3: malloc (vg_replace_malloc.c:236) 
==2599== by 0x41E546F: strdup (strdup.c:43) 
==2599== by 0x804BB84: Schema::Schema(char*, char*) (Schema.cc:115) 
==2599== by 0x804EDF4: main (main.cc:23) 
==2599== 
==2599== 188 bytes in 16 blocks are definitely lost in loss record 17 of 19 
==2599== at 0x4025BD3: malloc (vg_replace_malloc.c:236) 
==2599== by 0x41E546F: strdup (strdup.c:43) 
==2599== by 0x804BB84: Schema::Schema(char*, char*) (Schema.cc:115) 
==2599== by 0x804EEA4: main (main.cc:37) 
==2599== 
==2599== LEAK SUMMARY: 
==2599== definitely lost: 421 bytes in 37 blocks 
==2599== indirectly lost: 0 bytes in 0 blocks 
==2599==  possibly lost: 0 bytes in 0 blocks 
==2599== still reachable: 16,906 bytes in 18 blocks 
==2599==   suppressed: 0 bytes in 0 blocks 
==2599== Reachable blocks (those to which a pointer was found) are not shown. 
==2599== To see them, rerun with: --leak-check=full --show-reachable=yes 
==2599== 
==2599== For counts of detected and suppressed errors, rerun with: -v 
==2599== ERROR SUMMARY: 6 errors from 6 contexts (suppressed: 19 from 8) 
+2

Вы прочитали это http://valgrind.org/docs/manual/quick-start.html#quick-start.interpret? – sharptooth

ответ

8

Выходной сигнал показывает вполне ясно стек для того, где утечка (и проиграл, то есть. Нет указателей, на которые остаются) память была выделена, в строках 86 и 115 Schema.cc (strdup вызова)

5

из strdup() описания OpenGroup в: функция

strdup() возвращает указатель на новую строку, которая является дубликатом строки, на которую указывает s1. Возвращенный указатель может быть передан в free(). Если новая строка не может быть создана, возвращается нулевой указатель.

Короче говоря, strdup() вызывает malloc(). Вам понадобится free(), что итоговая строка, когда вы закончите с ней. Хотя, поскольку вы используете C++, я бы настоятельно рекомендовал std::string, если вы можете. Помните, что если вам действительно нужен C-эквивалент string.c_str(), вы получите его для вас.

Смежные вопросы