青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Kisser Leon

這個kisser不太冷
posts - 100, comments - 102, trackbacks - 0, articles - 0

摘要
本文分析了Windows環境使用MFC調試內存泄露的技術,介紹了在Windows環境下用VC++查找,定位和消除內存泄露的方法技巧。

關鍵詞:VC++;CRT 調試堆函數;試探法。

編譯環境
VC++6.0
技術原理
檢測內存泄漏的主要工具是調試器和 CRT 調試堆函數。若要啟用調試堆函數,請在程序中包括以下語句:

#define CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
注意 #include 語句必須采用上文所示順序。如果更改了順序,所使用的函數可能無法正確工作。

通過包括 crtdbg.h,將 malloc 和 free 函數映射到其“Debug”版本_malloc_dbg 和_free_dbg,這些函數將跟蹤內存分配和釋放。此映射只在調試版本(在其中定義了 _DEBUG)中發生。發布版本使用普通的 malloc 和 free 函數。

#define 語句將 CRT 堆函數的基版本映射到對應的“Debug”版本。并非絕對需要該語句,但如果沒有該語句,內存泄漏轉儲包含的有用信息將較少。

在添加了上面所示語句之后,可以通過在程序中包括以下語句來轉儲內存泄漏信息:
_CrtDumpMemoryLeaks();
當在調試器下運行程序時,_CrtDumpMemoryLeaks 將在“輸出”窗口中顯示內存泄漏信息。內存泄漏信息如下所示:
Detected memory leaks!
Dumping objects ->
C:PROGRAM FILESVISUAL STUDIOMyProjectsleaktestleaktest.cpp(20) : {18} normal block at 0x00780E80, 64 bytes long.
Data: <        > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete. 
如果不使用 #define _CRTDBG_MAP_ALLOC 語句,內存泄漏轉儲如下所示:
Detected memory leaks!
Dumping objects ->
{18} normal block at 0x00780E80, 64 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete. 

未定義 _CRTDBG_MAP_ALLOC 時,所顯示的會是:

內存分配編號(在大括號內)。
塊類型(普通、客戶端或 CRT)。
十六進制形式的內存位置。
以字節為單位的塊大小。
前 16 字節的內容(亦為十六進制)。
定義了 _CRTDBG_MAP_ALLOC 時,還會顯示在其中分配泄漏的內存的文件。文件名后括號中的數字(本示例中為 20)是該文件內的行號。

轉到源文件中分配內存的行

在"輸出"窗口中雙擊包含文件名和行號的行。
-或-

在"輸出"窗口中選擇包含文件名和行號的行,然后按 F4 鍵。

_CrtSetDbgFlag 

如果程序總在同一位置退出,則調用 _CrtDumpMemoryLeaks 足夠方便,但如果程序可以從多個位置退出該怎么辦呢?不要在每個可能的出口放置一個對 _CrtDumpMemoryLeaks 的調用,可以在程序開始包括以下調用:

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); 

該語句在程序退出時自動調用 _CrtDumpMemoryLeaks。必須同時設置 _CRTDBG_ALLOC_MEM_DF 和 _CRTDBG_LEAK_CHECK_DF 兩個位域,如上所示。

說明
在VC++6.0的環境下,不再需要額外的添加

#define CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h> 

只需要按F5,在調試狀態下運行,程序退出后在"輸出窗口"可以看到有無內存泄露。如果出現

Detected memory leaks!
Dumping objects -> 

就有內存泄露。

確定內存泄露的地方
根據內存泄露的報告,有兩種消除的方法:

第一種比較簡單,就是已經把內存泄露映射到源文件的,可以直接在"輸出"窗口中雙擊包含文件名和行號的行。例如

Detected memory leaks!
Dumping objects ->
C:PROGRAM FILESVISUAL STUDIOMyProjectsleaktestleaktest.cpp(20) : {18} normal block at 0x00780E80, 64 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
C:PROGRAM FILESVISUAL STUDIOMyProjectsleaktestleaktest.cpp(20)

就是源文件名稱和行號。

第二種比較麻煩,就是不能映射到源文件的,只有內存分配塊號。

Detected memory leaks!
Dumping objects ->
{18} normal block at 0x00780E80, 64 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete. 

  這種情況我采用一種"試探法"。由于內存分配的塊號不是固定不變的,而是每次運行都是變化的,所以跟蹤起來很麻煩。但是我發現雖然內存分配的塊號是變化的,但是變化的塊號卻總是那幾個,也就是說多運行幾次,內存分配的塊號很可能會重復。因此這就是"試探法"的基礎。

  1. 先在調試狀態下運行幾次程序,觀察內存分配的塊號是哪幾個值;
  2. 選擇出現次數最多的塊號來設斷點,在代碼中設置內存分配斷點: 添加如下一行(對于第 18 個內存分配):
    _crtBreakAlloc = 18; 
    或者,可以使用具有同樣效果的 _CrtSetBreakAlloc 函數:
    _CrtSetBreakAlloc(18); 

     

  3. 在調試狀態下運行序,在斷點停下時,打開"調用堆棧"窗口,找到對應的源代碼處;
  4. 退出程序,觀察"輸出窗口"的內存泄露報告,看實際內存分配的塊號是不是和預設值相同,如果相同,就找到了;如果不同,就重復步驟3,直到相同。
  5. 最后就是根據具體情況,在適當的位置釋放所分配的內存。
Google

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩视频在线一区二区观看视频 | 欧美精品1区2区3区| 欧美伦理一区二区| 亚洲青涩在线| 欧美不卡视频| 久久嫩草精品久久久精品一| 国产精品美女久久久久aⅴ国产馆| 91久久精品日日躁夜夜躁国产| 久久婷婷国产综合精品青草| 欧美一区二区视频观看视频| 国产精品夜夜夜| 亚洲资源在线观看| 中国亚洲黄色| 国产精品国产三级国产普通话三级 | 亚洲黄色在线看| 欧美不卡在线| 欧美xx69| 一区二区三区四区五区精品| 亚洲乱亚洲高清| 欧美色道久久88综合亚洲精品| 99一区二区| 一区二区三区久久久| 国产精品久久久久久久app| 亚洲欧美日韩精品久久久| 亚洲天堂av在线免费| 国产日韩亚洲欧美精品| 久久久国际精品| 老牛国产精品一区的观看方式| 亚洲精品看片| 中文国产一区| 国产一区日韩欧美| 亚洲国产精品久久精品怡红院 | 欧美电影专区| 欧美在线999| 亚洲激情国产| 亚洲欧美日韩精品久久奇米色影视 | 欧美一级视频免费在线观看| 久久一区二区三区国产精品| 亚洲一区一卡| 国产欧美精品日韩精品| 久久久精品欧美丰满| 久久国产视频网| 亚洲日本aⅴ片在线观看香蕉| 亚洲精品系列| 国产三区精品| 欧美激情麻豆| 国产精品视频免费观看| 久久久女女女女999久久| 欧美成人综合| 久久精品国产一区二区三区| 欧美国产高清| 性久久久久久| 欧美国产日韩一区二区在线观看| 亚洲尤物视频在线| 久久久久久久一区| 亚洲一区二区高清视频| 欧美专区一区二区三区| 一区二区精品国产| 久久精品观看| 亚洲欧美日韩国产综合| 欧美成人精品一区| 午夜欧美精品久久久久久久| 欧美成年视频| 久久精品一区二区国产| 欧美日韩亚洲一区二区三区| 久久久人成影片一区二区三区 | 欧美日韩国产成人在线观看| 久久久综合免费视频| 欧美日韩亚洲系列| 亚洲福利视频专区| 国产亚洲一区二区三区在线观看| 亚洲国产视频直播| 狠狠久久亚洲欧美| 亚洲一区二区免费视频| 99天天综合性| 欧美国产一区二区| 欧美成人国产va精品日本一级| 国产欧美日韩综合精品二区| 日韩网站在线| 亚洲美女av在线播放| 你懂的成人av| 欧美电影在线| 91久久久精品| 久久亚洲欧美| 欧美大成色www永久网站婷| 久久亚洲春色中文字幕| 久久深夜福利免费观看| 亚洲在线1234| 欧美日韩三级电影在线| 亚洲高清视频在线观看| 国内精品免费午夜毛片| 久久成人人人人精品欧| 亚洲一区二区三区视频| 欧美国产精品人人做人人爱| 欧美高清视频在线| 亚洲成人在线观看视频| 老司机成人网| 亚洲国产精彩中文乱码av在线播放| 狠狠爱成人网| 玖玖精品视频| 亚洲高清不卡在线| 亚洲美女电影在线| 欧美日产一区二区三区在线观看| 亚洲精品国产精品国自产在线 | 久久成人久久爱| 久久精品一级爱片| 狠狠色2019综合网| 久久婷婷影院| 91久久线看在观草草青青| 99热精品在线| 国产精品美腿一区在线看| 亚洲免费一在线| 老牛国产精品一区的观看方式| 尤物yw午夜国产精品视频| 欧美国产精品一区| 在线视频欧美日韩精品| 欧美在线一二三区| 激情成人av在线| 欧美人与性动交α欧美精品济南到 | 亚洲国产综合91精品麻豆| 一本色道久久综合一区| 国产精品日韩欧美一区| 久久久91精品国产一区二区三区 | 亚洲电影免费在线| 亚洲视频免费观看| 国产午夜精品理论片a级探花 | 国产精品婷婷午夜在线观看| 欧美在线观看视频一区二区| 亚洲大片一区二区三区| 亚洲永久免费| 亚洲福利国产| 欧美色偷偷大香| 久久久国产一区二区三区| 亚洲毛片一区| 久久综合狠狠综合久久综青草| 一本一本大道香蕉久在线精品| 国产乱码精品1区2区3区| 模特精品在线| 午夜精品久久久久久| 亚洲国产精品高清久久久| 欧美在现视频| 亚洲色在线视频| 1024成人| 午夜精品网站| 亚洲精品久久久久久久久久久久| 欧美在线综合| 国产视频一区在线| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲欧美国产视频| 欧美性理论片在线观看片免费| 在线免费不卡视频| 在线视频亚洲欧美| 国产精品欧美风情| 伊人男人综合视频网| 欧美黄色aaaa| 久久久国产一区二区| 亚洲天堂久久| 亚洲激情自拍| 欧美.www| 麻豆成人综合网| 久久精品视频播放| 亚洲欧美激情在线视频| 日韩亚洲不卡在线| 亚洲国产高清高潮精品美女| 国产日韩在线看| 国产精品麻豆欧美日韩ww | 永久域名在线精品| 国产一区日韩一区| 国产日韩综合| 国产一区二区在线观看免费播放 | 欧美一级理论片| 亚洲一区二区影院| 亚洲一区二区三区四区视频 | 欧美中日韩免费视频| 亚洲欧美日本视频在线观看| 亚洲午夜久久久久久久久电影网| 亚洲激情成人网| 亚洲国产高清aⅴ视频| 欧美激情视频一区二区三区在线播放| 久久免费视频在线| 久久综合99re88久久爱| 狼人天天伊人久久| 蜜臀久久99精品久久久久久9 | 亚洲欧美综合国产精品一区| 亚洲宅男天堂在线观看无病毒| 亚洲无线视频| 欧美一乱一性一交一视频| 午夜欧美精品| 久久久天天操| 欧美二区不卡| 欧美亚州一区二区三区| 国产精品久久久久9999高清| 国产精品视频专区| 国产亚洲欧美一区二区三区| 狠狠色丁香婷婷综合影院| 欧美人成免费网站| 欧美日韩精品一区二区三区四区| 欧美午夜免费电影| 国产一区二区日韩| 亚洲韩国精品一区|