2016-07-22 53 views
0

我最近一直自學NCURSES和我決定測試中的valgrind我的代碼來檢查任何內存泄漏。這少量的代碼給出了與我的程序相同的錯誤結果,我想知道是否有人知道它有什麼問題,或者可以指示我回答問題。ncurses的內存分配的valgrind消息

#include <ncurses.h> 
int main() 
{ 
    initscr(); 
    WINDOW *win = newwin(0,0,10,10); 
    delwin(win); 
    endwin(); 
    return 0; 
} 

== 20986 == MEMCHECK,存儲器錯誤檢測器
== 20986 ==版權(C)2002至2013年,和GNU GPL下,Julian Seward寫等。
== 20986 ==使用Valgrind-3.10.1和LibVEX;與-h版權信息重新運行
== == 20986命令:./a.out
== == 20986
== == 20986
== == 20986 HEAP摘要:
== 20986 ==在出口使用:在193塊
== 20986 ==總堆使用281089個字節:248個allocs,55周的FreeS,353425個字節分配
== 20986 ==
== 20986 == LEAK SUMMARY:
== 20986 ==絕對丟失:0字節0塊
== 20986 ==間接丟失:0字節0塊
== 20986 ==可能丟失:0字節0塊
== 20986 ==仍可達:在193塊
== 20986 ==抑制281089個字節:在0塊
0字節== 20986 ==重新運行--leak檢查=全看到泄漏的內存
== == 20986
==細節20986 ==進行檢測和抑制的錯誤計數,重新運行:-v
== == 20986 ERROR摘要:從0上下文0錯誤(抑制:0 0)

感謝您的時間。

+0

好吧,valgrind告訴你0字節被泄漏,281089字節仍然被分配,但顯然沒有泄漏。那究竟有什麼問題? – immibis

回答

1

圖書館很多時候你int main()結束後做的事情。

如此說來,發生了什麼之後的例子如下:

#7 0x00007ffff72abfe8 in __run_exit_handlers (status=0, 
    listp=0x7ffff76355f8 <__exit_funcs>, 
    [email protected]=true) at exit.c:82 
#8 0x00007ffff72ac035 in __GI_exit (status=<optimized out>) at exit.c:104 
#9 0x00007ffff7292837 in __libc_start_main (
    main=0x429e26 <main(int, char**)>, argc=1, argv=0x7fffffffde28, 
    init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, 
    stack_end=0x7fffffffde18) at ../csu/libc-start.c:325 
#10 0x0000000000419f69 in _start() 
在一個示例程序

。上述輸出由GDB提供。但是,相關性在堆棧跟蹤#7上,您會看到一個部分,表示listp=0x7ffff76355f8;這是註冊到atexit();函數的函數回調列表。有可能在ncurses中使用任何東西,甚至一些std/stl庫可以在那裏進行清理。一般來說,或者至少我已經讀過,valgrind不能總是選擇那些免費的資源,因爲調用庫正在管理它們的清理。

+0

感謝您使用GDB錯誤日誌和您的解釋。我現在知道了爲什麼valgrind會說這樣的話。回答了我的問題。 – AxiosAmneisa

+0

任何時間 - 快樂編程。 – M4rc

3

顯示的代碼沒有任何問題。各種運行時庫在運行時爲其內部緩衝區分配內存是正常的,而不會在共享庫卸載時釋放內存。

+0

是這樣嗎?我沒有意識到這一點。謝謝你回答我。 – AxiosAmneisa

1

答案是在ncurses的常見問題Testing for Memory Leaks

也許你使用的工具,例如dmallocvalgrind檢查內存泄漏。它通常會報告大量仍在使用的內存。這很正常。

Ncurses的configure腳本中有一個選項,--disable-leaks,你可以用它來繼續分析。它告訴ncurses儘可能釋放內存。但是,大部分使用中的內存是「永久」的。

任何實現的詛咒不得自由與屏幕有關,因爲(甚至稱endwin()後),它必須是可用於向refresh()下次調用使用的內存。由於性能的原因,也有大量的內存。這使得難以分析curses應用程序的內存泄漏。要解決這個問題,請構建一個調試版本的ncurses庫,它可以釋放這些塊,並提供_nc_free_and_exit()函數以釋放退出時的餘數。 ncurses實用程序和test programs使用此功能,例如,通過ExitProgram()宏。

例如,Debian提供了可能對測試內存泄漏有用的軟件包:libncurses5-dbglibncursesw5-dbg

+0

非常感謝您的支持。我將來肯定會使用該頁面和網站。 – AxiosAmneisa