在学习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到内存泄漏的地方就停下来。
此法对于查找内存泄漏非常方便。