valgrind检测libevent内存泄露
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 常見錯誤
- 使用未初始化的內存
- 在內存被釋放后進行讀 / 寫
- 從已分配內存塊的尾部進行讀 / 寫
- 內存泄露
- 不匹配地使用 malloc/new/new [] 和 free/delete/delete []
- 兩次釋放內存
總結
以上是生活随笔為你收集整理的valgrind检测libevent内存泄露的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C学习笔记:基础
- 下一篇: matlab机械臂工作空间代码_老外研发