在學習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模式下在代碼中添加如下代碼:
?
-
-
-
-
-
- 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到內存泄漏的地方就停下來。
此法對于查找內存泄漏非常方便。