生活随笔
收集整理的這篇文章主要介紹了
在VS2013平台下如何快速解决c++代码内存泄漏问题
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
在學(xué)習(xí)FPS3000人臉關(guān)鍵點定位算法時,發(fā)現(xiàn)github上的源碼,存在大量的內(nèi)存泄漏問題,在訓(xùn)練的時發(fā)現(xiàn)內(nèi)存一直在增長,測試的時候也存在內(nèi)存無法徹底釋放的問題。
一直以為是存放模型參數(shù)vector<class>結(jié)構(gòu)的問題,?采用以下方法手動釋放,仍然無法解決問題。
?
vector<class> regressors_; regressors_.clear(); std::vector<Regressor>().swap(regressors_); 經(jīng)過仔細(xì)檢查發(fā)現(xiàn),有好幾個類沒有析構(gòu)函數(shù),于是就添加了CascadeRegressor::~CascadeRegressor();Regressor::~Regressor();RandomForest::~RandomForest();Node::~Node();由于class類不支持手動釋放,只能在析構(gòu)函數(shù)里自動釋放內(nèi)存。而且還發(fā)現(xiàn)有很多new()和#define Malloc(type,n) (type *)malloc((n)*sizeof(type))手動方式分配的內(nèi)存沒有手動釋放。
?
那我是怎么發(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(); 此處添加自己的代碼 } ?
二、然后編譯執(zhí)行程序,如果代碼中存在內(nèi)存泄漏,則在程序終止時,輸出端口看到如下內(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ù)中的這個函數(shù)去掉注釋,
?
?
int main() { EnableMemLeakCheck(); _CrtSetBreakAlloc(3558059); 此處添加自己的代碼 }
?
然后重新編譯并執(zhí)行程序,代碼就會run到內(nèi)存泄漏的地方就停下來。
此法對于查找內(nèi)存泄漏非常方便。
總結(jié)
以上是生活随笔為你收集整理的在VS2013平台下如何快速解决c++代码内存泄漏问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。