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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

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

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

在學習FPS3000人臉關鍵點定位算法時,發現github上的源碼,存在大量的內存泄漏問題,在訓練的時發現內存一直在增長,測試的時候也存在內存無法徹底釋放的問題。

一直以為是存放模型參數vector<class>結構的問題,?采用以下方法手動釋放,仍然無法解決問題。

?

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

    ?

    那我是怎么發現的呢?方法如下:

    一、在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);
  • 此處添加自己的代碼
  • }
  • ?

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

    ?

  • 線程 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的地方存在內存泄漏,那我們可以把main()函數中的這個函數去掉注釋,

    ?

    ?

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


  • ?

    然后重新編譯并執行程序,代碼就會run到內存泄漏的地方就停下來。

    此法對于查找內存泄漏非常方便。

    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。