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