最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解windows下C/C++的內(nèi)存泄露檢測

 更新時(shí)間:2021年06月09日 11:09:07   作者:lsgxeva  
C/C++由于其沒有垃圾回收機(jī)制,所以內(nèi)存的釋放一直以來都依靠于程序員的手工釋放,因此極其容易出現(xiàn)內(nèi)存泄露的問題,而在比較大的程序之中,查找內(nèi)存泄露是一件比較困難的事情,所以我們需要一些簡便的方法來檢測內(nèi)存泄露,避免內(nèi)存泄露導(dǎo)致設(shè)備崩潰

檢測內(nèi)存泄露

利用Visual Studio調(diào)試器和CRT庫提供的檢測(malloc和new均適用)

程序只從單一位置退出時(shí):

1.需要以下頭文件:

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

通過包含crtdbg.h,將malloc和free分別映射到_malloc_dbg和_free_dbg,用于內(nèi)存分配和釋放的跟蹤。
#define _CRTDBG_MAP_ALLOC語句用于提供額外的信息,非絕對必要。

2.在程序退出位置前使用以下語句:

_CrtDumpMemoryLeaks();

該語句會(huì)在輸出窗口顯示內(nèi)存泄露信息。

測試代碼

#define _CRTDBG_MAP_ALLOC
#include<stdio.h>
#include<stdlib.h>
#include<crtdbg.h>
#define NUM 10

int main()
{
    char *test;
    test = (char*)malloc(NUM * sizeof(char));
    _CrtDumpMemoryLeaks();
    return 0;
}

輸出結(jié)果

使用_CRTDBG_MAP_ALLOC時(shí):

未使用_CRTDBG_MAP_ALLOC時(shí):

如果將程序中的:

char *test;
test = (char*)malloc(NUM * sizeof(char));

替換為:

char* name = new char[10];

也會(huì)得到同樣的結(jié)果(內(nèi)存位置由于自動(dòng)分配有所不同):

程序從多個(gè)位置退出時(shí):

1.同樣包含上述頭文件

2.在每個(gè)會(huì)退出程序的函數(shù)(包括main函數(shù))開始處包含以下代碼:

_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

程序會(huì)在退出時(shí)自動(dòng)調(diào)用_CrtDumpMemoryLeaks();。

測試代碼

#define _CRTDBG_MAP_ALLOC
#include<stdio.h>
#include<stdlib.h>
#include<crtdbg.h>
#define NUM 10

void test1();
void test2();

int main()
{
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
    char *test;
    test = (char*)malloc(NUM * sizeof(char));
    int a;
    puts("input a number");
    scanf_s("%d", &a, sizeof(int));
    if (a > 10)
        test1();
    else if(a<20)
        test2();
    else
        puts("exit point 3");
    return 0;
}

void test1()
{
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
    puts("exit point 1");
    exit(EXIT_SUCCESS);
}

void test2()
{
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
    puts("exit point 2");
    exit(EXIT_SUCCESS);
}

輸出結(jié)果

定位內(nèi)存泄露

當(dāng)程序不大時(shí),內(nèi)存泄露位置可以輕易通過肉眼分辨或者代碼審計(jì)發(fā)現(xiàn)。但是當(dāng)程序較大的時(shí)候,就難以發(fā)現(xiàn)具體發(fā)生內(nèi)存泄露的位置。此時(shí)可以通過CRT庫的_CrtMenState結(jié)構(gòu)儲(chǔ)存內(nèi)存狀態(tài)。

使用該結(jié)構(gòu)類型需要定義變量用于儲(chǔ)存內(nèi)存狀態(tài):

_CrtMenState s1,s2,s3;

檢測指定位置內(nèi)存需要用到_CrtMenCheckPoint結(jié)構(gòu):

_CrtMenCheckPoint(&s1);

該語句將當(dāng)前位置的內(nèi)存狀態(tài)傳遞到_CrtMenState結(jié)構(gòu)變量s1中。

檢測兩個(gè)位置之間的內(nèi)存狀態(tài)需要用到_CrtMenDifference()函數(shù),同時(shí)需要一個(gè)新的_CrtMenState結(jié)構(gòu)變量用于存儲(chǔ)狀態(tài)之間的差異:

_CrtMemCheckpoint( &s1 );
_CrtMemCheckpoint( &s2 );
_CrtMemDifference( &s3, &s1, &s2);

轉(zhuǎn)儲(chǔ)_CrtMenState結(jié)構(gòu)的內(nèi)容需要用到_CrtMemDumpStatistics函數(shù):

_CrtMenDumpStatics(&s3);

測試代碼

#define _CRTDBG_MAP_ALLOC
#include<stdio.h>
#include<stdlib.h>
#include<crtdbg.h>
#define NUM 10

_CrtMemState s1, s2, s3;
void MEM(char *str, int n);

int main()
{
    _CrtMemCheckpoint(&s1);
    char *test=NULL;
    MEM(test, NUM);
    _CrtMemCheckpoint(&s2);
    puts("test\n");
    _CrtMemDifference(&s3, &s1, &s2);
    _CrtMemDumpStatistics(&s3);
    return 0;
}

void MEM(char *str, int n)
{
    str = (char*)malloc(n * sizeof(char));
}

輸出結(jié)果

當(dāng)s1和s2之間調(diào)用了函數(shù)MEN()時(shí)

當(dāng)刪去程序中的

MEN(test, NUM);

即s1和s2之間沒有調(diào)用MEN()函數(shù)時(shí):

如果單純使用_CrtDumpMemoryLeaks();,只能顯示內(nèi)存分配的位置,即函數(shù)MEN()中分配內(nèi)存語句的位置,而不能定位到是哪一次對函數(shù)MEN()調(diào)用導(dǎo)致的內(nèi)存泄露,而通過結(jié)構(gòu)_CrtMenState,可以得到語句之間是否存在內(nèi)存分配,從而定位出內(nèi)存泄露的位置。

總結(jié)

內(nèi)存泄露的原因很簡單,無非就是分配了內(nèi)存而沒有釋放,為了解決這個(gè)問題,除了養(yǎng)成良好的習(xí)慣,還有要善用工具在編寫程序的時(shí)候?qū)崟r(shí)監(jiān)測是否出現(xiàn)內(nèi)存泄露,減少后期排bug時(shí)的工作量。

以上就是詳解windows下C/C++的內(nèi)存泄露檢測的詳細(xì)內(nèi)容,更多關(guān)于windows下C/C++的內(nèi)存泄露檢測的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • c++ 連接兩個(gè)字符串實(shí)現(xiàn)代碼 實(shí)現(xiàn)類似strcat功能

    c++ 連接兩個(gè)字符串實(shí)現(xiàn)代碼 實(shí)現(xiàn)類似strcat功能

    c++ 連接兩個(gè)字符串實(shí)現(xiàn)代碼 實(shí)現(xiàn)類似strcat功能,需要的朋友可以參考下
    2012-05-05
  • C++庫std::flush的具體使用

    C++庫std::flush的具體使用

    std::flush是C++標(biāo)準(zhǔn)庫中的一個(gè)操作符,用于刷新輸出流,本文主要介紹了C++庫std::flush的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • 深入解析C中的數(shù)值與真假

    深入解析C中的數(shù)值與真假

    本篇文章是對C中數(shù)值與真假進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言結(jié)構(gòu)體的具體使用方法

    C語言結(jié)構(gòu)體的具體使用方法

    這篇文章主要介紹了C語言結(jié)構(gòu)體的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • C語言通訊錄管理系統(tǒng)完整代碼

    C語言通訊錄管理系統(tǒng)完整代碼

    這篇文章主要為大家詳細(xì)介紹了C語言通訊錄管理系統(tǒng)完整代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C/C++編程中const的使用詳解

    C/C++編程中const的使用詳解

    這篇文章主要為大家詳細(xì)介紹了C/C++編程中const的使用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C/C++ 中堆和棧及靜態(tài)數(shù)據(jù)區(qū)詳解

    C/C++ 中堆和棧及靜態(tài)數(shù)據(jù)區(qū)詳解

    這篇文章主要介紹了C/C++ 中堆和棧及靜態(tài)數(shù)據(jù)區(qū)詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • C++創(chuàng)建窗口程序的實(shí)現(xiàn)示例

    C++創(chuàng)建窗口程序的實(shí)現(xiàn)示例

    Windows窗體應(yīng)用程序是C#語言中的一個(gè)重要應(yīng)用,本文主要介紹了C++創(chuàng)建窗口程序的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • 全面了解C語言?static?關(guān)鍵字

    全面了解C語言?static?關(guān)鍵字

    這篇文章主要介紹了全面了解C語言?static?關(guān)鍵字,文章首先通過先介紹一下頭文件的創(chuàng)建展開主題的詳細(xì)內(nèi)容,需要的小伙伴可以參考一下
    2022-04-04
  • C語言基礎(chǔ) strlen 函數(shù)

    C語言基礎(chǔ) strlen 函數(shù)

    這篇文章主要介紹了C語言基礎(chǔ) strlen 函數(shù),在C 語言中,char 字符串也是一種非常重要的數(shù)據(jù)類型,我們可以使用 strlen 函數(shù)獲取字符串長度,這就是C語言strlen 函數(shù)的作用,下面我們來簡單介紹該內(nèi)容,需要的朋友可以參考以下
    2021-10-10

最新評論

叙永县| 扎赉特旗| 遂昌县| 石河子市| 广东省| 会理县| 洪江市| 临漳县| 桂东县| 龙南县| 朝阳区| 赣州市| 德阳市| 夏河县| 怀宁县| 天镇县| 义乌市| 松江区| 和硕县| 尖扎县| 乌恰县| 和政县| 虹口区| 泽州县| 巴里| 武汉市| 清水县| 布拖县| 万州区| 通城县| 南城县| 宝应县| 若羌县| 大悟县| 宁阳县| 天峻县| 清丰县| 高台县| 固镇县| 富平县| 乌兰浩特市|