了解valgrind输出
问题描述:
我是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)
答
输出显示一清二楚的堆栈即泄漏(和丢失,即没有指向这仍然)分配内存,在线条86和Schema.cc(一个strdup
呼叫)的115
答
从OpenGroup的的strdup()描述:
的的strdup()函数将返回一个指针到一个新的字符串,它是字符串的复制到s1指向的。返回的指针可以传递给free()。如果无法创建新字符串,则返回空指针。
总之,strdup()
正在调用malloc()
。你需要free()
这个结果字符串,当你完成它。虽然,当你使用C++时,如果可以的话,我会强烈推荐std::string
。请记住,如果你真的需要C等价物string.c_str()
将得到它。
你看过http://valgrind.org/docs/manual/quick-start.html#quick-start.interpret了吗? – sharptooth 2011-01-20 15:31:39