valgrind檢測libevent內存泄露
github地址
在使用封裝好的http
庫時,遇到了如下的內存泄露,一開始在definitely
處還存在泄露,這里就不貼圖了,已經被淹沒了。

根據提示定位出錯代碼位置,如下圖:

這里提示evhttp_new
這里出現了泄露,我們先到http
庫中解決已經存在的內存泄露,在析構函數里已經對這一塊做了處理如下圖:

這里有一個注意點,因為這里是單獨起的線程運行的event_base_dispatch(event_base_);
,所以我們在event_base_loopbreak
后,需要等線程執行完畢后,在釋放event_base_free(event_base_);
,這里還需要執行libevent_global_shutdown();
,否則still reachable:
部分還會存在泄露。還有一處地方存在泄露,在昨天用同樣的方法定位到的,這里記錄一下:

左邊是之前出現泄露的情況,右邊是修改后的代碼。改完這些后,我們在http
庫下運行測試程序,發現:

已經沒有泄露了,剩下來的72704 bytes in 1 blocks
是和gcc
版本有關,在gcc 7.40
上是沒有這個問題的。庫的內存泄露解決了,下面我們到生產環境中去,發現還是存在泄露,明明我們在析構中已經做了處理,我在庫代碼中加入了日志信息,發現并沒有進入析構函數,也就沒有執行回收的代碼,出現了內存泄露。定位到原因在這里:

我們需要把這里的類聲明去掉,具體原因見我另一篇文章。最終將所有存在內存泄露都給解決了。
附錄:memcheck 常見錯誤
- 使用未初始化的內存
==1001== Use of uninitialised value of size 8
- 在內存被釋放后進行讀 / 寫
==1001== Invalid read of size 1
- 從已分配內存塊的尾部進行讀 / 寫
==1001== Invalid read of size 1
- 內存泄露
==1001== LEAK SUMMARY
- 不匹配地使用
malloc/new/new []
和free/delete/delete []
==1001== Mismatched free() / delete / delete []
- 兩次釋放內存
==1001== Invalid free() / delete / delete[]