2014-02-14 37 views
1

我在我的程序中使用了GNU線性編程工具包。一切工作正常,但是當我檢查程序與Valgrind的,我發現了一些內存泄漏:在程序終止時清理GLPK最乾淨的方法

==7051== 160 bytes in 1 blocks are still reachable in loss record 1 of 3 
==7051== at 0x4C28BED: malloc (vg_replace_malloc.c:263) 
==7051== by 0x52CFACB: glp_init_env (in /usr/lib/libglpk.so.0.30.0) 
==7051== by 0x52CFC1C: ??? (in /usr/lib/libglpk.so.0.30.0) 
==7051== by 0x52D0211: glp_malloc (in /usr/lib/libglpk.so.0.30.0) 
==7051== by 0x52AC50A: glp_create_prob (in /usr/lib/libglpk.so.0.30.0) 

根據文檔glp_init_env(void)被稱爲第一次使用任何GLPK API調用。但要清理它,人們需要撥打glp_free_env(void)

我希望我的程序能夠無內存泄漏,只需手動調用glp_free_env();對我來說不是一個好的解決方案 - 我有一些使用Boost單元測試框架編寫的單元測試,我希望它們也可以無內存泄漏。

理想情況下,我會使用一些C++功能,可以在程序終止時自動調用它。你知道任何簡單和乾淨的方法嗎?

+0

爲什麼你不希望調用'free'函數來匹配你的'init'函數? –

+0

我認爲問題在於'..init..'在庫中被自動調用,而不是直接由用戶代碼調用。 – benjymous

+0

是的,我不直接調用init。當我使用'SIGABRT'或類似的庫後,只需運行'glp_free_env()',我就需要仔細選擇何時處理庫。如果我在程序終止時運行功能,則不存在發生此類事件的風險。 –

回答

1

如果benjymous's answer不適合某些原因或其他,std::atexit可以幫助:

int atexit(void (*func)()); 

寄存器功能通過FUNC指出,要在正常 程序終止調用(通過的std ::退出()或從 CPP /語言/ main函數返回)

+0

這就是我正在尋找的!謝謝! –

1

像這樣的東西應該工作

class CleanupOnExit 
{ 
public: 
    ~CleanupOnExit() 
    { 
     glp_free_env(void); 
    } 
}; 

int main() 
{ 
    CleanupOnExit cleanup; 

    .. do any processing here .. 

    return 0; 
} 

cleanup的析構函數會自動在main末被調用(即使你在中間返回,或者拋出一個異常。)

+2

更好的方法是讓該類也執行init。 –

+0

還有Boost單元測試框架 - 它會自動創建main()函數,所以您的方法只能解決我的部分問題。 –

相關問題