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

VisualStudio 應用Visual Leak Detector檢討內存洩露

編輯:關於C++

VisualStudio 應用Visual Leak Detector檢討內存洩露。本站提示廣大學習愛好者:(VisualStudio 應用Visual Leak Detector檢討內存洩露)文章只能為提供參考,不一定能成為您想要的結果。以下是VisualStudio 應用Visual Leak Detector檢討內存洩露正文


那末在Windows下有甚麼好的內存洩露檢測對象呢?微軟供給Visual Studio開辟對象自己沒有甚麼太好的內存洩露檢測功效,我們可使用第三方對象Visual Leak Detector(以下簡稱vld)。

vld對象是VC++情況下一款玲珑易用、收費開源的內存洩露檢測對象,vld可以顯示招致內存洩露的完全內存分派挪用客棧。vld的檢測申報可以或許對每一個內存洩露點供給完全的客棧跟蹤,而且包括其源文件及行號信息。

裝置進程是,先在到地址http://vld.codeplex.com/下載vld裝置文件,然落後行裝置,裝置進程中須要裝置法式會設置裝備擺設情況變量。我們須要記住裝置目次。

裝置完成後翻開要檢測的Visual Studio工程,我們須要在工程中設置裝備擺設:vld頭文件目次和vld庫目次。

選中游戲工程,翻開菜單“項目”→ “屬性”彈收工程屬性對話框,如圖所示,選擇“設置裝備擺設屬性”→“VC++目次” →“慣例”,在左邊的“包括目次”中添加C:\Program Files (x86)\Visual Leak Detector\include,個中C:\Program Files (x86)\Visual Leak Detector是我的vld裝置目次。“庫目次”中添加C:\Program Files (x86)\Visual Leak Detector\lib\Win32,留意設置裝備擺設目之間須要用分號分離隔。

設置裝備擺設完成以後點擊肯定按鈕封閉對話框,然後我們須要在法式代碼中引入頭文件#include <vld.h>,然則這個頭文件在哪裡引入比擬好?假如是通俗的一個VC++工程在哪裡引入都無所謂,然則Cocos2d-x的工程就分歧了,我們須要斟酌跨平台,#include <vld.h>代碼不宜添加到Classes目次下的h或cpp文件中,這個目次下的文件是要在其它平台編譯運轉的,而#include <vld.h>只是在Windrows平台才有用。我們可以在Win32目次(見圖)下的main.cpp或main.h文件引入頭文件。這些文件是與Win32平台有關的,分歧平台移植的時刻不須要。

假如在main.cpp中引入代碼以下:

#include "main.h" 
#include "AppDelegate.h" 
#include "cocos2d.h" 
  
#include <vld.h> 
  
USING_NS_CC; 
  
int APIENTRY _tWinMain(HINSTANCE hInstance, 
            HINSTANCE hPrevInstance, 
            LPTSTR  lpCmdLine, 
            int    nCmdShow) 
{ 
  UNREFERENCED_PARAMETER(hPrevInstance); 
  UNREFERENCED_PARAMETER(lpCmdLine); 
  
  // create the application instance 
  AppDelegate app; 
  return Application::getInstance()->run(); 
} 

引入以後,就測試一下了,我們來工資制作一個內存洩露,與20.1.1一節一樣在HelloWorldScene.cpp中修正代碼:

bool HelloWorld::init() 
{ 
if ( !Layer::init() ) 
{ 
return false; 
} 
  __String *s = new __String(); 
  
  log("%s",s->getCString()); 
  
… … 
  
return true; 
} 

運轉工程,須要留意的是在法式運轉進程中vld是沒有客棧輸入的,然則日記會有輸入vld的裝置信息,日記信息以下:

Visual Leak Detector Version 2.4RC2 installed.

Ready for GLSL

Ready for OpenGL 2.0

… …

從日記中可以看到vld能否裝置勝利,和裝置的版本。要想看到vld檢測申報須要加入法式後,才會在日記中輸入信息。應用Cocos2d-x會輸入許多日記信息,信息以下:

---------- Block 526166 at 0x0821FA80: 84 bytes ----------

 Leak Hash: 0x780B2033, Count: 1, Total 84 bytes

 Call Stack (TID 4660):

... ...

---------- Block 526214 at 0x08224378: 8 bytes ----------

 Leak Hash: 0xE1DC1852, Count: 1, Total 8 bytes

 Call Stack (TID 4660):

... ...

 Data:

  63 6F 63 6F  73 32 64 20  61 75 74 6F  72 65 6C 65   cocos2d. autorele

  61 73 65 20  70 6F 6F 6C  00 CD CD CD  CD CD CD CD   ase.pool ........

Visual Leak Detector detected 33 memory leaks (2892 bytes).

Largest number used: 3204961 bytes.

Total allocations: 69022415 bytes.

Visual Leak Detector is now exiting.

個中一個Block表現一個內存洩露點,在浩瀚Block假如可以或許找到關於我們本身類的日記信息呢?我們可以查找症結字“helloworldscene.cpp”,這便可以定位到HelloWorld場景中的內存洩露的Block了,我們找到以下日記信息:

---------- Block 1153 at 0x01533C70: 48 bytes ----------

 Leak Hash: 0x5545A5ED, Count: 1, Total 48 bytes

 Call Stack (TID 2088):

  f:\dd\vctools\crt_bld\self_x86\crt\src\new.cpp (57): MSVCR110D.dll!operator new

  d:\helloworld\classes\helloworldscene.cpp (33): HelloWorld.exe!HelloWorld::init + 0x7 bytes

  d:\helloworld\classes\helloworldscene.h (37): HelloWorld.exe!HelloWorld::create + 0xB1 bytes

  d:\helloworld\classes\helloworldscene.cpp (12): HelloWorld.exe!HelloWorld::createScene + 0x5 bytes

  d:\helloworld\classes\appdelegate.cpp (30): HelloWorld.exe!AppDelegate::applicationDidFinishLaunching + 0x5 bytes

  d:\helloworld\cocos2d\cocos\2d\platform\win32\ccapplication.cpp (74): HelloWorld.exe!cocos2d::Application::run + 0xF bytes

  d:\helloworld\proj.win32\main.cpp (19): HelloWorld.exe!wWinMain + 0xC bytes

  f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (528): HelloWorld.exe!__tmainCRTStartup + 0x15 bytes

  f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (377): HelloWorld.exe!wWinMainCRTStartup

  0x7563850D (File and line number not available): KERNEL32.DLL!BaseThreadInitThunk + 0xE bytes

  0x77B7BF39 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x85 bytes

  0x77B7BF0C (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x58 bytes

 Data:

  1C 34 07 01  01 00 00 00  27 00 00 00  00 00 00 00   .4...... '.......

  2C 34 07 01  A0 77 01 03  00 CD CD CD  CD CD CD CD   ,4...w.. ........

  CD CD CD CD  CD CD CD CD  00 00 00 00  0F 00 00 00   ........ ........

從這個日記中能看到內存洩露點,從日記的客棧中找到我們本身編寫的類,點擊那一行翻開代碼窗口,定位內存洩露點代碼,如圖所示。

定位內存洩露點

找到哪個有能夠有內存洩露,處理就不是成績了。

以上所述就是本文的全體內容了,願望年夜家可以或許愛好。

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