日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

在VS2013平台下如何快速解决c++代码内存泄漏问题

發(fā)布時(shí)間:2025/3/8 c/c++ 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在VS2013平台下如何快速解决c++代码内存泄漏问题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在學(xué)習(xí)FPS3000人臉關(guān)鍵點(diǎn)定位算法時(shí),發(fā)現(xiàn)github上的源碼,存在大量的內(nèi)存泄漏問題,在訓(xùn)練的時(shí)發(fā)現(xiàn)內(nèi)存一直在增長,測試的時(shí)候也存在內(nèi)存無法徹底釋放的問題。

一直以為是存放模型參數(shù)vector<class>結(jié)構(gòu)的問題,?采用以下方法手動(dòng)釋放,仍然無法解決問題。

?

  • vector<class> regressors_;
  • regressors_.clear();
  • std::vector<Regressor>().swap(regressors_);
  • 經(jīng)過仔細(xì)檢查發(fā)現(xiàn),有好幾個(gè)類沒有析構(gòu)函數(shù),于是就添加了CascadeRegressor::~CascadeRegressor();Regressor::~Regressor();RandomForest::~RandomForest();Node::~Node();由于class類不支持手動(dòng)釋放,只能在析構(gòu)函數(shù)里自動(dòng)釋放內(nèi)存。而且還發(fā)現(xiàn)有很多new()和#define Malloc(type,n) (type *)malloc((n)*sizeof(type))手動(dòng)方式分配的內(nèi)存沒有手動(dòng)釋放。

    ?

    那我是怎么發(fā)現(xiàn)的呢?方法如下:

    一、在VS2013的DeBug模式下在代碼中添加如下代碼:

    ?

  • #include <stdlib.h>
  • #include <crtdbg.h>
  • #ifdef _DEBUG
  • #define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
  • #endif
  • void EnableMemLeakCheck()
  • {
  • int tmpFlag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
  • tmpFlag |= _CRTDBG_LEAK_CHECK_DF;
  • _CrtSetDbgFlag(tmpFlag);
  • }
  • using namespace std;
  • int main()
  • {
  • EnableMemLeakCheck();
  • //_CrtSetBreakAlloc(3558059);
  • 此處添加自己的代碼
  • }
  • ?

    二、然后編譯執(zhí)行程序,如果代碼中存在內(nèi)存泄漏,則在程序終止時(shí),輸出端口看到如下內(nèi)容:

    ?

  • 線程 0x1b24 已退出,返回值為 0 (0x0)。
  • Detected memory leaks!
  • Dumping objects ->
  • {3558059} normal block at 0x0000000007F11480, 62544 bytes long.
  • Data: < y W] > CC AD FF AD AA 1B A2 BE 79 9E 57 5D E2 8E FE BE
  • {3558049} normal block at 0x0000000007CB98F0, 88 bytes long.
  • Data: < > 0C 00 00 00 CD CD CD CD CD CD CD CD CD CD CD CD
  • {3558025} normal block at 0x0000000007EF1A90, 62544 bytes long.
  • Data: < FR > .u ?> E2 CB 46 52 DD 11 E1 3E CB C9 93 2E 75 BE 00 3F
  • {3558015} normal block at 0x0000000007CBA170, 88 bytes long.
  • Data: < > 0C 00 00 00 CD CD CD CD CD CD CD CD CD CD CD CD
  • ?

    從以上log中可以看到3558059的地方存在內(nèi)存泄漏,那我們可以把main()函數(shù)中的這個(gè)函數(shù)去掉注釋,

    ?

    ?

  • int main()
  • {
  • EnableMemLeakCheck();
  • _CrtSetBreakAlloc(3558059);
  • 此處添加自己的代碼
  • }


  • ?

    然后重新編譯并執(zhí)行程序,代碼就會(huì)run到內(nèi)存泄漏的地方就停下來。

    此法對(duì)于查找內(nèi)存泄漏非常方便。

    總結(jié)

    以上是生活随笔為你收集整理的在VS2013平台下如何快速解决c++代码内存泄漏问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。