利用虚拟主机建设企业网站实验报告,外贸网站推广与优化,购物网站类型,档案网站建设优秀代表在学习FPS3000人脸关键点定位算法时#xff0c;发现github上的源码#xff0c;存在大量的内存泄漏问题#xff0c;在训练的时发现内存一直在增长#xff0c;测试的时候也存在内存无法彻底释放的问题。 一直以为是存放模型参数vectorclass结构的问题#xff0c; 采…在学习FPS3000人脸关键点定位算法时发现github上的源码存在大量的内存泄漏问题在训练的时发现内存一直在增长测试的时候也存在内存无法彻底释放的问题。 一直以为是存放模型参数vectorclass结构的问题 采用以下方法手动释放仍然无法解决问题。 vectorclass regressors_; regressors_.clear(); std::vectorRegressor().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到内存泄漏的地方就停下来。 此法对于查找内存泄漏非常方便。