[英]GNU readline: enormous memory leak
請考慮以下代碼段:
#include <stdio.h>
#include <stdlib.h>
#include <readline/readline.h>
int main() {
for (;;) {
char *buf = readline(">>> ");
if (!buf)
break;
free(buf);
}
}
使用-lreadline
編譯,在valgrind
下執行程序並輸入一些行會導致巨大的內存泄漏,在我的系統上,valgrinds判斷看起來像這樣:
==7651== LEAK SUMMARY:
==7651== definitely lost: 0 bytes in 0 blocks
==7651== indirectly lost: 0 bytes in 0 blocks
==7651== possibly lost: 0 bytes in 0 blocks
==7651== still reachable: 213,455 bytes in 217 blocks
==7651== suppressed: 0 bytes in 0 blocks
運行--show-leak-kinds=all
結果都是這樣的(整個事情是幾百行,我只會顯示開頭):
==7693== 5 bytes in 1 blocks are still reachable in loss record 1 of 57
==7693== at 0x483777F: malloc (vg_replace_malloc.c:299)
==7693== by 0x48CE409: xmalloc (in /usr/lib/libreadline.so.8.0)
==7693== by 0x48A72E6: rl_set_prompt (in /usr/lib/libreadline.so.8.0)
==7693== by 0x48A87E6: readline (in /usr/lib/libreadline.so.8.0)
==7693== by 0x10915C: main (in /home/.../a.out)
==7693==
==7693== 5 bytes in 1 blocks are still reachable in loss record 2 of 57
==7693== at 0x483777F: malloc (vg_replace_malloc.c:299)
==7693== by 0x48CE409: xmalloc (in /usr/lib/libreadline.so.8.0)
==7693== by 0x48B95BC: ??? (in /usr/lib/libreadline.so.8.0)
==7693== by 0x48B9D25: rl_expand_prompt (in /usr/lib/libreadline.so.8.0)
==7693== by 0x48A7309: rl_set_prompt (in /usr/lib/libreadline.so.8.0)
==7693== by 0x48A87E6: readline (in /usr/lib/libreadline.so.8.0)
==7693== by 0x10915C: main (in /home/.../a.out)
==7693==
==7693== 8 bytes in 1 blocks are still reachable in loss record 3 of 57
==7693== at 0x483777F: malloc (vg_replace_malloc.c:299)
==7693== by 0x496C49E: strdup (in /usr/lib/libc-2.28.so)
==7693== by 0x4AEEDCD: _nc_trim_sgr0 (in /usr/lib/libncursesw.so.6.1)
==7693== by 0x4AE7EA2: tgetent_sp (in /usr/lib/libncursesw.so.6.1)
==7693== by 0x48C39BC: _rl_init_terminal_io (in /usr/lib/libreadline.so.8.0)
==7693== by 0x48A851C: rl_initialize (in /usr/lib/libreadline.so.8.0)
==7693== by 0x48A87EC: readline (in /usr/lib/libreadline.so.8.0)
==7693== by 0x10915C: main (in /home/.../a.out)
現在盡管內存沒有丟失,但readline在程序退出之前根本沒有釋放大量內存這一事實對我來說似乎完全荒謬。 我錯過了什么嗎? 我應該手動調用一些記錄不完整的清理功能嗎? 這是一個錯誤嗎? 這是否發生在每個系統上?
互聯網上似乎有幾個類似的問題,但我很驚訝地發現即使在最簡單的用例中也會發生這種情況。
編輯:因為有很多討論我會澄清一點:布魯諾的回答當然是正確的,它不是傳統意義上的內存泄漏,幾乎在所有平台上都沒關系(我包括Linux標簽) ,這是一個錯誤,我現在已經將其刪除了),但是我仍然想知道這是否真的是故意的,或者是否因為只有在valgrind產生統計數據后才釋放內存,並且有任何方法可以解決這個問題(或者至少讓valgrind忽略它,這樣它就不會掩蓋其余代碼中缺少的free
調用)
GNU readline:巨大的內存泄漏
==7651== LEAK SUMMARY: ==7651== definitely lost: 0 bytes in 0 blocks ==7651== indirectly lost: 0 bytes in 0 blocks ==7651== possibly lost: 0 bytes in 0 blocks
沒有內存泄漏
==7651== still reachable: 213,455 bytes in 217 blocks ==7651== suppressed: 0 bytes in 0 blocks ...
可達內存不是內存泄漏
==7693== 5 bytes in 1 blocks are still reachable in loss record 1 of 57 ==7693== at 0x483777F: malloc (vg_replace_malloc.c:299) ==7693== by 0x48CE409: xmalloc (in /usr/lib/libreadline.so.8.0) ==7693== by 0x48A72E6: rl_set_prompt (in /usr/lib/libreadline.so.8.0) ==7693== by 0x48A87E6: readline (in /usr/lib/libreadline.so.8.0) ==7693== by 0x10915C: main (in /home/.../a.out) ...
getline使用內存並仍然引用它,不要忘記它管理歷史記錄,並且可以釋放歷史記錄調用void rl_clear_history (void)
,在程序中添加該函數調用並重做測試
Function: void rl_clear_history (void) Clear the history list by deleting all of the entries, in the same manner as the History library's clear_history() function. This differs from clear_history because it frees private data Readline saves in the history list.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.