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

隨筆-381  評論-37  文章-0  trackbacks-0

原帖:http://blog.csdn.net/i_like_cpp/archive/2007/06/28/1669962.aspx
作者:許式偉 2006年11月某日

內存管理是C++程序員的痛。我的《內存管理變革》系列就是試圖討論更為有效的內存管理方式,以杜絕(或減少)內存泄漏,減輕C++程序員的負擔。由于工作忙的緣故,這個系列目前未完,暫停。
?
這篇短文我想換個方式,討論一下如何以最快的速度找到內存泄漏。
?
確認是否存在內存泄漏
我們知道,MFC程序如果檢測到存在內存泄漏,退出程序的時候會在調試窗口提醒內存泄漏。例如:

class CMyApp : public CWinApp
{
public:
?? BOOL InitApplication()
?? {
?????? int* leak = new int[10];
?????? return TRUE;
?? }
};
產生的內存泄漏報告大體如下:

Detected memory leaks!
Dumping objects ->
c:\work\test.cpp(186) : {52} normal block at 0x003C4410, 40 bytes long.
?Data: <??????????????? > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
這挺好。問題是,如果我們不喜歡MFC,那么難道就沒有辦法?或者自己做?

呵呵,這不需要。其實,MFC也沒有自己做。內存泄漏檢測的工作是VC++的C運行庫做的。也就是說,只要你是VC++程序員,都可以很方便地檢測內存泄漏。我們還是給個樣例:

#include <crtdbg.h>

inline void EnableMemLeakCheck()
{
?? _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);
}

void main()
{
?? EnableMemLeakCheck();
?? int* leak = new int[10];
}
?運行(提醒:不要按Ctrl+F5,按F5),你將發現,產生的內存泄漏報告與MFC類似,但有細節不同,如下:

Detected memory leaks!
Dumping objects ->
{52} normal block at 0x003C4410, 40 bytes long.
?Data: <??????????????? > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
為什么呢?看下面。

定位內存泄漏由于哪一句話引起的
你已經發現程序存在內存泄漏。現在的問題是,我們要找泄漏的根源。

一般我們首先確定內存泄漏是由于哪一句引起。在MFC中,這一點很容易。你雙擊內存泄漏報告的文字,或者在Debug窗口中按F4,IDE就幫你定位到申請該內存塊的地方。對于上例,也就是這一句:

?? int* leak = new int[10];

這多多少少對你分析內存泄漏有點幫助。特別地,如果這個new僅對應一條delete(或者你把delete漏寫),這將很快可以確認問題的癥結。

我們前面已經看到,不使用MFC的時候,生成的內存泄漏報告與MFC不同,而且你立刻發現按F4不靈。那么難道MFC做了什么手腳?

其實不是,我們來模擬下MFC做的事情??聪吕?

inline void EnableMemLeakCheck()
{
?? _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);
}

#ifdef _DEBUG
#define new?? new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif

void main()
{
?? EnableMemLeakCheck();
?? int* leak = new int[10];
}

再運行這個樣例,你驚喜地發現,現在內存泄漏報告和MFC沒有任何分別了。

快速找到內存泄漏
單確定了內存泄漏發生在哪一行,有時候并不足夠。特別是同一個new對應有多處釋放的情形。在實際的工程中,以下兩種情況很典型:

創建對象的地方是一個類工廠(ClassFactory)模式。很多甚至全部類實例由同一個new創建。對于此,定位到了new出對象的所在行基本沒有多大幫助。
?
COM對象。我們知道COM對象采用Reference Count維護生命周期。也就是說,對象new的地方只有一個,但是Release的地方很多,你要一個個排除。
那么,有什么好辦法,可以迅速定位內存泄漏?

答:有。

在內存泄漏情況復雜的時候,你可以用以下方法定位內存泄漏。這是我個人認為通用的內存泄漏追蹤方法中最有效的手段。

我們再回頭看看crtdbg生成的內存泄漏報告:

Detected memory leaks!
Dumping objects ->
c:\work\test.cpp(186) : {52} normal block at 0x003C4410, 40 bytes long.
?Data: <??????????????? > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
除了產生該內存泄漏的內存分配語句所在的文件名、行號為,我們注意到有一個比較陌生的信息:{52}。這個整數值代表了什么意思呢?

其實,它代表了第幾次內存分配操作。象這個例子,{52}代表了第52次內存分配操作發生了泄漏。你可能要說,我只new過一次,怎么會是第52次?這很容易理解,其他的內存申請操作在C的初始化過程調用的唄。:)

有沒有可能,我們讓程序運行到第52次內存分配操作的時候,自動停下來,進入調試狀態?所幸,crtdbg確實提供了這樣的函數:即 long _CrtSetBreakAlloc(long nAllocID)。我們加上它:

inline void EnableMemLeakCheck()
{
?? _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);
}

#ifdef _DEBUG
#define new?? new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif

void main()
{
?? EnableMemLeakCheck();
?? _CrtSetBreakAlloc(52);
?? int* leak = new int[10];
}
你發現,程序運行到 int* leak = new int[10]; 一句時,自動停下來進入調試狀態。細細體會一下,你可以發現,這種方式你獲得的信息遠比在程序退出時獲得文件名及行號有價值得多。因為報告泄漏文件名及行號,你獲得的只是靜態的信息,然而_CrtSetBreakAlloc則是把整個現場恢復,你可以通過對函數調用棧分析(我發現很多人不習慣看函數調用棧,如果你屬于這種情況,我強烈推薦你去補上這一課,因為它太重要了)以及其他在線調試技巧,來分析產生內存泄漏的原因。通常情況下,這種分析方法可以在5分鐘內找到肇事者。

當然,_CrtSetBreakAlloc要求你的程序執行過程是可還原的(多次執行過程的內存分配順序不會發生變化)。這個假設在多數情況下成立。不過,在多線程的情況下,這一點有時難以保證。

?


附加說明:
對“內存管理”相關的技術感興趣?這里可以看到我的所有關于內存管理的文章。

?

本文來自CSDN博客,轉載請標明出處: http://blog.csdn.net/i_like_cpp/archive/2007/06/28/1669962.aspx

posted on 2010-01-21 23:14 小王 閱讀(855) 評論(0)  編輯 收藏 引用 所屬分類: c++ 程序設計基礎
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            91久久精品国产91久久| 欧美四级在线观看| 亚洲人午夜精品| 欧美成人性生活| 麻豆成人在线| 欧美91大片| 欧美韩日视频| 亚洲国产精品高清久久久| 亚洲国产精品va在线看黑人动漫| 奶水喷射视频一区| 欧美国产免费| 亚洲精品一区二区三区不| 亚洲精选视频免费看| 一区二区三区 在线观看视| 一区二区三区欧美在线观看| 91久久精品美女高潮| 日韩写真视频在线观看| 亚洲免费中文字幕| 久久久亚洲高清| 亚洲欧洲另类国产综合| 亚洲视频专区在线| 久久露脸国产精品| 欧美日韩精品| 好吊色欧美一区二区三区四区| 亚洲日本欧美天堂| 欧美一区二区三区在| 欧美 日韩 国产 一区| 日韩午夜三级在线| 欧美一区二区性| 欧美日韩精品三区| 黄色一区二区三区| 亚洲视频一区在线观看| 老司机免费视频一区二区三区| 日韩写真视频在线观看| 久久久精品国产一区二区三区 | 黄色资源网久久资源365| 亚洲一区二区在线免费观看| 久久国产精品色婷婷| 久久久噜噜噜久久| 久久精品综合一区| 欧美日韩精品二区| 国产日韩在线亚洲字幕中文| 亚洲福利免费| 亚洲午夜一区二区三区| 久久久www免费人成黑人精品| 欧美黄色小视频| 亚洲午夜在线观看视频在线| 久久黄色小说| 欧美日韩国产亚洲一区| 欧美xxx成人| 欧美午夜剧场| 伊人婷婷欧美激情| 亚洲综合精品自拍| 欧美国产日韩xxxxx| 亚洲一品av免费观看| 久久久精品动漫| 国产精品久久久久天堂| 亚洲国产精品久久久久婷婷老年| 亚洲一区免费视频| 欧美电影免费| 午夜日韩在线观看| 欧美日韩的一区二区| 精品av久久707| 亚洲另类自拍| 久久噜噜噜精品国产亚洲综合| 亚洲国产欧洲综合997久久| 午夜久久tv| 国产精品第一区| 亚洲欧洲精品一区二区三区不卡 | 国产九色精品成人porny| 日韩亚洲欧美中文三级| 玖玖国产精品视频| 欧美亚洲综合网| 国产精品美女| 一本久道久久综合中文字幕| 免费成人黄色片| 久久不见久久见免费视频1| 国产精品久久二区二区| 亚洲最黄网站| 亚洲日本中文字幕| 一区二区三区欧美激情| 久久精品综合| 国产亚洲人成a一在线v站| 亚洲伊人伊色伊影伊综合网| 91久久国产自产拍夜夜嗨| 蜜臀久久久99精品久久久久久| 国产日韩欧美精品综合| 欧美亚洲在线观看| 亚洲免费视频网站| 国产精品国产三级国产专播精品人 | 中文日韩欧美| 久久激情综合| 一本色道久久综合亚洲91| 欧美乱妇高清无乱码| av成人免费| 亚洲一区久久久| 国产乱人伦精品一区二区| 欧美一区日韩一区| 欧美在线免费| 亚洲第一中文字幕| 欧美大片免费| 欧美激情精品久久久久久变态 | 欧美一级片在线播放| 好吊色欧美一区二区三区四区| 久久久久久亚洲精品中文字幕 | 一本色道久久综合| 在线视频亚洲| 欧美人体xx| 狠狠狠色丁香婷婷综合久久五月| 一区二区三区三区在线| 美女精品一区| 久久亚洲私人国产精品va媚药| 国产精品欧美日韩久久| 久久精品毛片| 久久夜色精品| 亚洲一级黄色| 久久激情综合| 日韩图片一区| 日韩午夜电影在线观看| 欧美视频一区二区在线观看| 久热精品视频在线观看一区| 欧美成人网在线| 欧美一区视频在线| 免费在线成人av| 亚洲免费在线看| 久久久久久九九九九| 在线午夜精品自拍| 久久国产一区二区| 一区二区欧美日韩| 欧美在线视频免费观看| 日韩视频永久免费观看| 亚洲欧美日韩综合aⅴ视频| 在线观看欧美日韩| 亚洲欧美变态国产另类| 国产日韩欧美在线播放不卡| 久久在线免费观看| 欧美日韩在线播放一区二区| 麻豆91精品91久久久的内涵| 国产精品观看| 亚洲国产精品一区二区www在线| 国产精品丝袜白浆摸在线| 亚洲丁香婷深爱综合| 国产亚洲激情在线| av成人国产| 日韩视频精品在线| 久久免费99精品久久久久久| 久久av资源网站| 欧美丝袜一区二区三区| 亚洲国产精品久久91精品| 亚洲麻豆视频| 欧美大片国产精品| 欧美国产第一页| 欧美三级黄美女| 日韩视频中午一区| 亚洲天堂激情| 国产日韩欧美自拍| 欧美一区二区大片| 欧美成人性网| 亚洲精品日韩在线观看| 亚洲免费网站| 麻豆精品视频在线观看| 国产一区二区三区无遮挡| 久久天天躁夜夜躁狠狠躁2022| 久久久久久久欧美精品| 韩国三级电影一区二区| 久久精品一二三区| 欧美jizzhd精品欧美巨大免费| 18成人免费观看视频| 牛牛影视久久网| 亚洲午夜在线观看| 久久精品免费电影| 国产精品免费电影| 噜噜噜91成人网| 欧美激情一区二区三区高清视频| 亚洲一二三区在线观看| 国产精品人人爽人人做我的可爱| 久久精品中文字幕一区| 欧美福利视频一区| 午夜宅男欧美| 韩日成人在线| 久久九九国产精品怡红院| 国产精品视频免费| 另类天堂av| 亚洲福利免费| 亚洲人成高清| 国产视频一区免费看| 久久一二三国产| 亚洲免费高清| 欧美综合77777色婷婷| 国户精品久久久久久久久久久不卡 | 一区二区三区久久久| 国产精品久久久久久av福利软件| 一区二区三区欧美视频| 久久久久久黄| 亚洲国产一区二区三区高清| 欧美欧美在线| 欧美一区二区三区四区在线观看| 欧美成人日本| 亚洲一区二区三区三| 影音国产精品|