丟失的位元組 - 忘記釋放
這是一個呼叫 malloc 但不是免費的程式:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
char *s;
s = malloc(26); // the culprint
return 0;
}
沒有額外的引數,valgrind 將不會查詢此錯誤。
但是如果我們開啟 --leak-check=yes
或 --tool=memcheck
,如果程式是在除錯模式下編譯的話,它會抱怨並顯示導致這些記憶體洩漏的行:
$ valgrind -q --leak-check=yes ./missing_free
==4776== 26 bytes in 1 blocks are definitely lost in loss record 1 of 1
==4776== at 0x4024F20: malloc (vg_replace_malloc.c:236)
==4776== by 0x80483F8: main (missing_free.c:9)
==4776==
如果程式沒有在除錯模式下編譯(例如在 GCC 中使用 -g
標誌),它仍然會告訴我們在相關功能方面發生洩漏的位置,而不是線路。
這讓我們回過頭來看看在該行中分配了哪個塊,並嘗試向前追蹤以檢視它未被釋放的原因。