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

鍵盤的詠嘆調

常用鏈接

統計

最新評論

【zz】使用CRT調試內存分配堆來找出未釋放的內存空間

   原地址:http://blog.csdn.net/Donjuan/archive/2009/02/02/3859154.aspx

   忘記釋放已經分配的內存是一種常見的編程錯誤,當然我指的是在
C++編程當中,例如下面的代碼里面就存在一個忘記釋放內存的編程錯誤。我個人覺得忘記釋放內存的編程錯誤是不可避免的,畢竟程序員都是人,困了,心情不好了,代碼過于復雜啦等等都可能導致忘記加上一句delete XXX語句。

// 未釋放內存空間.cpp : Defines the entry point for the console application.

 

#include "stdafx.h"

#include <windows.h>

#include <string>

#include <iostream>

 

using namespace std;

 

class CTestClass

{

public:

    CTestClass(LPWSTR szName)

    {

        m_lpName = new wstring(szName);

    }

 

    ~CTestClass()

    {

    }

 

    void PrintName()

    {

        wcout << *m_lpName << endl;

    }

 

private:

    wstring *m_lpName;

};

 

HRESULT CreateTestClass(LPWSTR szName, CTestClass **ppObject)

{

    *ppObject = new CTestClass(szName);

    if ( (*ppObject) == NULL )

        return E_FAIL;

    else

        return S_OK;

}

 

int _tmain(int argc, _TCHAR* argv[])

{

    CTestClass *pObject = NULL;

    HRESULT hr = CreateTestClass(L"This is a Test", &pObject);

    if ( hr != S_OK )

    {

        return -1;

    }

    else

    {

        pObject->PrintName();  // pObject沒有被釋放

        return 0;

    }

}

 

實際上Visual Studio已經提供了方法幫助你快速找到這些沒有釋放的內存。

 

Visual Studio提供了一系列的CRT調試API,CRT提供了一個調試內存分配堆,可以跟蹤和管理內存在什么地方分配,當你在這個堆上分配內存的時候,每一次內存分配調用例如malloc或者new,CRT都會額外分配大約36個字節用來保存例如這個內存塊分配的文件名、行號、內存塊的大小等信息,最后CRT將這些內存塊使用一個雙鏈表鏈接起來。每一次內存釋放的時候,free或者delete函數就從這個內存塊鏈表里面將要釋放的內存塊刪除,因此在需要檢查內存泄漏的時候,只要遍歷這個雙鏈表依次打印出這些內存塊就可以發現所有未釋放的內存了。下面是CRT內存塊的原始聲明:

typedef struct _CrtMemBlockHeader

{

    // Pointer to the block allocated just before this one:

    struct _CrtMemBlockHeader *pBlockHeaderNext;

    // Pointer to the block allocated just after this one:

    struct _CrtMemBlockHeader *pBlockHeaderPrev;

    char *szFileName;    // File name

    int nLine;           // Line number

    size_t nDataSize;    // Size of user block

    int nBlockUse;       // Type of block

    long lRequest;       // Allocation number

    // Buffer just before (lower than) the user's memory:

    unsigned char gap[nNoMansLandSize];

} _CrtMemBlockHeader;

 

下面的代碼演示了如何使用CRT提供的調試API來修改剛才的源文件檢測未釋放的內存空間(注意紅色添加的部分):

// 未釋放內存空間.cpp : Defines the entry point for the console application.

//

 

#include "stdafx.h"

#include <windows.h>

#include <string>

#include <iostream>

// 使用CRT調試API

#include <crtdbg.h>

 

using namespace std;

 

// 將所有的內存分配函數new替換成CRT提供的調試new

#ifdef _DEBUG

#   define DEBUG_CLIENTBLOCK new(_CLIENT_BLOCK, __FILE__, __LINE__)

#else

#   define DEBUG_CLIENTBLOCK

#endif

 

#ifdef _DEBUG

#    define new DEBUG_CLIENTBLOCK

#endif

 

class CTestClass

{

public:

    CTestClass(LPWSTR szName)

    {

        m_lpName = new wstring(szName);

    }

 

    ~CTestClass()

    {

    }

 

    void PrintName()

    {

        wcout << *m_lpName << endl;

    }

 

private:

    wstring *m_lpName;

};

 

HRESULT CreateTestClass(LPWSTR szName, CTestClass **ppObject)

{

    *ppObject = new CTestClass(szName);

    if ( (*ppObject) == NULL )

        return E_FAIL;

    else

        return S_OK;

}

 

int _tmain(int argc, _TCHAR* argv[])

{  

// 設置CRT調試API的報表輸出模式,將所有的錯誤、警告還有斷言都輸出到控制臺

    _CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE );

    _CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDOUT );

    _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE );

    _CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDOUT );

    _CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE );

    _CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDOUT );

 

    CTestClass *pObject = NULL;

    HRESULT hr = CreateTestClass(L"This is a Test", &pObject);

    if ( hr != S_OK )

    {

        return -1;

    }

    else

    {

        pObject->PrintName();

 

// 檢查未釋放的內存

        _CrtDumpMemoryLeaks();

        return 0;

    }

}

posted on 2009-02-03 11:59 鍵盤的詠嘆調 閱讀(435) 評論(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>
            亚洲午夜激情| 国产美女精品一区二区三区| 99伊人成综合| 亚洲美女精品成人在线视频| 亚洲精品美女免费| 99在线热播精品免费| 亚洲一二三区在线| 久久本道综合色狠狠五月| 久久久免费精品| 欧美激情网友自拍| 国产精品日韩欧美大师| 激情综合电影网| 日韩视频在线观看免费| 欧美一区二区国产| 欧美mv日韩mv国产网站| 亚洲最新在线| 国产精品萝li| 一本色道久久综合亚洲精品婷婷 | 久久综合网络一区二区| 欧美激情一二区| 国产精品九九| 亚洲成人资源| 亚洲欧美变态国产另类| 欧美成人午夜免费视在线看片| 99精品欧美一区二区三区| 欧美在线播放视频| 欧美日韩国产一级| 亚洲高清三级视频| 久久爱www久久做| 亚洲激情av| 欧美在线综合| 欧美日韩中文在线| 亚洲经典在线看| 久久久久久夜| 亚洲已满18点击进入久久| 欧美国产综合| 在线精品视频一区二区| 欧美一区二区三区视频在线| 亚洲国产日韩一级| 久久一二三四| 国产在线拍偷自揄拍精品| 亚洲视频网站在线观看| 亚洲电影毛片| 美女尤物久久精品| 影音先锋日韩资源| 久久久亚洲国产天美传媒修理工 | 亚洲每日在线| 亚洲第一色在线| 久久久久久久国产| 国产一区日韩二区欧美三区| 羞羞答答国产精品www一本| 亚洲精品一区二区三区av| 欧美不卡在线视频| 91久久精品美女| 欧美xx69| 久热精品在线视频| 亚洲高清视频在线观看| 欧美高清hd18日本| 欧美成人综合网站| 一区二区日韩欧美| 亚洲美女免费精品视频在线观看| 美女视频黄 久久| 亚洲精品日产精品乱码不卡| 亚洲国产成人porn| 欧美精品久久一区| 亚洲主播在线播放| 亚洲午夜精品福利| 国产三区二区一区久久| 久久精品动漫| 亚洲一区日韩在线| 欧美午夜宅男影院| 午夜精品三级视频福利| 亚洲欧洲av一区二区| 国产九色精品成人porny| 久久av红桃一区二区小说| 久久高清福利视频| 亚洲片在线资源| 99亚洲视频| 国产偷国产偷精品高清尤物| 免费在线播放第一区高清av| 欧美大片专区| 亚洲免费人成在线视频观看| 亚洲欧美韩国| 91久久在线| 中文在线不卡视频| 一区二区亚洲| 亚洲另类黄色| 国产午夜精品麻豆| 亚洲国产精品va在线观看黑人| 欧美日韩精品二区第二页| 欧美亚洲三区| 欧美激情第一页xxx| 亚洲欧美日韩人成在线播放| 久久久青草婷婷精品综合日韩| 一区二区激情| 久久久97精品| 午夜精品久久久久久久蜜桃app| 久久久久久夜| 亚洲欧美综合精品久久成人| 久久综合伊人77777尤物| 亚洲网站在线| 久久一区二区三区国产精品| 亚洲天堂激情| 美女露胸一区二区三区| 久久国产日本精品| 欧美日韩在线亚洲一区蜜芽| 久久人人精品| 国产精品狼人久久影院观看方式| 欧美黑人在线播放| 国产日韩欧美精品| 一区二区三区视频观看| 亚洲激情小视频| 久久精品国产一区二区三区 | 久久久久国产成人精品亚洲午夜| 午夜一级久久| 欧美福利电影在线观看| 久久综合九色综合欧美狠狠| 国产精品欧美风情| 99精品欧美| 99热在这里有精品免费| 久久久久免费| 另类天堂视频在线观看| 国产亚洲欧美一区| 亚洲欧美国产日韩天堂区| 亚洲视频1区| 欧美日韩亚洲一区二区三区| 亚洲精品乱码久久久久久日本蜜臀 | 美日韩精品免费| 亚洲免费黄色| 国产精品伦理| 国产午夜精品福利| 亚洲一区激情| 亚洲愉拍自拍另类高清精品| 欧美日韩国产三级| 亚洲看片一区| 亚洲图片在区色| 欧美日韩国产麻豆| 亚洲免费观看在线观看| 正在播放亚洲一区| 欧美色图首页| 亚洲午夜精品一区二区三区他趣| 亚洲伊人观看| 国产欧美精品日韩| 午夜久久久久久| 久久精品综合| 黄色av日韩| 女仆av观看一区| 亚洲精品一区二区三区福利| 日韩视频在线播放| 欧美午夜精品一区| 午夜精品久久久久久久蜜桃app| 久久国产色av| 亚洲欧洲精品一区二区三区波多野1战4 | 国产精品日韩一区二区三区| 亚洲午夜激情网页| 久久久亚洲高清| 亚洲精品小视频| 欧美午夜免费影院| 欧美伊人久久久久久午夜久久久久| 久久在线免费观看| 日韩午夜电影在线观看| 国产精品区一区| 久久这里有精品视频| 亚洲精选久久| 久久久精品日韩| 亚洲精选在线| 国产精品一区在线观看你懂的| 亚洲久久成人| 久久国产精品色婷婷| 亚洲国产精品v| 国产精品久久久久久久久久直播 | 欧美在线黄色| 亚洲人成在线观看网站高清| 性欧美大战久久久久久久免费观看| 国产欧美日韩一区二区三区| 久久综合网络一区二区| 亚洲天堂av高清| 亚洲第一区色| 久久精品91久久香蕉加勒比 | 国产精品久久久久毛片大屁完整版| 久久成人免费电影| 日韩亚洲欧美一区二区三区| 国产欧美一区二区三区另类精品 | 欧美日韩精品在线视频| 欧美一区国产二区| 日韩亚洲欧美一区| 免费久久精品视频| 小嫩嫩精品导航| 日韩视频在线观看一区二区| 国语自产在线不卡| 久久精品夜色噜噜亚洲a∨| 麻豆精品视频在线| 午夜精品亚洲一区二区三区嫩草| 欧美高清视频在线| 久久精品噜噜噜成人av农村| 夜色激情一区二区| 亚洲国产一二三| 在线观看欧美黄色| 国产亚洲一区二区三区在线播放 | 国产日韩精品在线播放|