【问题标题】:Understanding Valgrind output了解 Valgrind 输出
【发布时间】:2011-01-20 15:27:09
【问题描述】:

我是 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)

【问题讨论】:

标签: c++ memory-leaks g++ valgrind


【解决方案1】:

输出显示在 Schema.cc 的第 86 行和第 115 行(strdup 调用)中分配了泄漏(和丢失,即没有剩余的指针)内存的堆栈。

【讨论】:

    【解决方案2】:

    来自 opengroup 的 strdup() 描述:

    strdup() 函数将返回一个指向新字符串的指针,该字符串是 s1 指向的字符串的副本。返回的指针可以传递给 free()。如果无法创建新字符串,则返回空指针。

    简而言之,strdup() 正在调用malloc()。完成后,您将需要free() 生成的字符串。虽然,当您使用 C++ 时,如果可以的话,我强烈推荐 std::string。请记住,如果您真的需要 C 等效项 string.c_str() 会为您提供。

    【讨论】:

      猜你喜欢
      • 2011-01-29
      • 2012-08-31
      • 1970-01-01
      • 2011-12-03
      • 2015-09-23
      • 1970-01-01
      • 1970-01-01
      • 2012-02-03
      • 2016-12-31
      相关资源
      最近更新 更多