程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++法式檢測內存洩露的辦法分享

C++法式檢測內存洩露的辦法分享

編輯:關於C++

C++法式檢測內存洩露的辦法分享。本站提示廣大學習愛好者:(C++法式檢測內存洩露的辦法分享)文章只能為提供參考,不一定能成為您想要的結果。以下是C++法式檢測內存洩露的辦法分享正文


1、媒介

在Linux平台上有valgrind可以異常便利的贊助我們定位內存洩露,由於Linux在開辟范疇的應用場景年夜多是跑辦事器,再加上它的開源屬性,絕對而言,處置成績輕易構成“同一”的尺度。而在Windows平台,辦事器和客戶端開辟人員習用的調試辦法有很年夜分歧。上面聯合我的現實經歷,整頓下罕見定位內存洩露的辦法。

留意:我們的剖析條件是Release版本,由於在Debug情況下,經由過程VLD這個庫或許CRT庫自己的內存洩露檢測函數可以或許剖析出內存洩露,絕對而言比擬簡略。而辦事器有許多成績須要在線上並發壓力情形下才湧現,是以評論辯論Debug版調試辦法意義不年夜。

2、對象計數

辦法:在對象結構時計數++,析構時--,每隔一段時光打印對象的數目

長處:沒有機能開支,簡直不占用額定內存。定位成果准確。

缺陷:侵入式辦法,需修正現有代碼,並且關於第三方庫、STL容器、劇本洩露等因沒法修正代碼而沒法定位。

3、重載new和delete

辦法:重載new/delete,記載分派點(乃至是挪用客棧),按期打印。

長處:沒有看出

缺陷:侵入式辦法,需將頭文件參加到年夜量源文件的頭部,以確珍重載的宏可以或許籠罩一切的new/delete。記載分派點須要加鎖(假如你的法式是多線程),並且記載分派要占用年夜量內存(也是占用的法式內存)。

4、Hook Windows體系API

辦法:應用微軟的detours庫,hook分派內存的體系Api:HeapAlloc/HeapRealloc/HeapFree(new/malloc的底層挪用),記載分派點,按期打印。

長處:非侵入式辦法,無需修正現有文件(hook api後,分派和釋放走到本身的鉤子函數中),檢討周全,對第三方庫、劇本庫等等都能統計到。

缺陷:記載內存須要占用年夜量內存,並且多線程情況須要加鎖。

5、應用DiagLeak檢測

微軟出品的內存洩露剖析對象,道理同hookapi方法。合營LDGraph可視化展現內存分派數據,更便利查找洩露。

1.在IDE工程選項外面設置裝備擺設Release版本也生成調試信息,宣布時,將pdb文件和exe文件一路宣布。

2.法式運轉後,翻開LeakDiag,設置Symbol path

3.按期Log下目的過程的內存分派情形,經由過程LDGraph打印分派增加情形,來發明內存洩露。

長處:同hookapi辦法,非侵入式修正,無需做任何代碼修改。跟蹤周全。可視化剖析客棧一目了然!

缺陷:對機能有影響,hook分派加鎖,遍歷客棧。然則不會占用目的過程的本身內存。

6、總結

關於線上臨盆情況,建議年夜對象用計數來斷定,定位疾速精確,簡直無機能開支。在對外測試階段,應用LeakDiag幫助剖析,由於此時並發壓力還不是太年夜,機能開支照樣可以蒙受。在線上年夜范圍運用階段,經由過程HookApi的辦法,聯合GM指令掌握部門時光段的檢測,如許可以把對玩家的影響(辦事器機能降低招致延遲)降到最低。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved