日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

valgrind检测libevent内存泄露

發布時間:2023/12/19 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 常見錯誤

  • 使用未初始化的內存
==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[]

總結

以上是生活随笔為你收集整理的valgrind检测libevent内存泄露的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。