在VS2013平台下如何快速解决c++代码内存泄漏问题
在学习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模式下在代码中添加如下代码:
- #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到内存泄漏的地方就停下来。
此法对于查找内存泄漏非常方便。
在VS2013平台下如何快速解决c++代码内存泄漏问题的更多相关文章
- Release编译模式下,事件是否会引起内存泄漏问题初步研究
题记:不常发生的事件内存泄漏现象 想必有些朋友也常常使用事件,但是很少解除事件挂钩,程序也没有听说过内存泄漏之类的问题.幸运的是,在某些情况下,的确不会出问题,很多年前做的项目就跑得好好的,包括我也是 ...
- 【转】Windows下Python快速解决error: Unable to find vcvarsall.bat
转自:http://blog.csdn.net/sad_sugar/article/details/73743863 系统配置:Windows10 x64, Visual Studio 2017, P ...
- Android平台下使用lua调用Java代码经验总结
动态语言以其执行的灵活性,可配置性.方便调试能够为开发带来极大的方便.假设用好了.能够极大的提高开发的效率. 怪不得像游戏开发这样复杂的软件开发里没有不集成脚本语言的. 当中,lua以其小巧,灵活.方 ...
- Windows下使用Gflags和UMDH查找内存泄漏
GFlags和UMDH与WinDbg一样,都是Debugging Tools for Windows里的工具. 1.设置符号路径 去微软官网下载对应的操作系统的符号安装文件,并安装到某个目录,如C:\ ...
- web 开发之js---理解并解决IE的内存泄漏方式
程序当中任何编程内存操作不当都会导致内存泄漏 http://wenku.baidu.com/link?url=8ba4UIn1aaevxTagH-F4vID79-bAfxdcLdeujGFn7PBnv ...
- Android性能优化之利用Rxlifecycle解决RxJava内存泄漏
前言: 其实RxJava引起的内存泄漏是我无意中发现了,本来是想了解Retrofit与RxJava相结合中是如何通过适配器模式解决的,结果却发现了RxJava是会引起内存泄漏的,所有想着查找一下资料学 ...
- AutoDispose代替RxLifecycle优雅的解决RxJava内存泄漏问题
使用过Rxjava的小伙伴都知道,在使用RxJava时如果处理不当,很可能会产生内存泄漏的问题. 我们使用rxjava最大的原因是响应式编程使我们的异步操作代码变得很优雅,在Android中,也使线程 ...
- VS2013/2012 下无法打开 源 文件“stdafx.h”的解决方法
VS2013/2012下代码一写上去保存就报错了,下方提示无法打开 源 文件“stdafx.h” 如图: 百度了一下,对于VS2010有这样的方法可以解决: 在项目属性中展开C/C++,选择常规,在附 ...
- windows平台下编辑的内容传到linux平台出现中文乱码的解决办法
现象说明:在windows下编辑的内容,上传到linux平台下出现中文乱码.如下: 在windows平台编写haha.txt文件,内容如下: 上传到linux平台,出现中文乱码,如下: 基本上面出现的 ...
随机推荐
- sgu187&&spoj7734
题解: splay翻转(只有翻转 sgu ac,spoj tle 代码: #pragma GCC optimize(2) #include<cstdio> #include<cstr ...
- java 需要看的书籍
参考链接:http://www.jianshu.com/p/454fc1e6cbe2 最近要看的有:Effective java 深入理解java 虚拟机 java 并发编程实战 (设计模式的书籍 ...
- 添加MyEclipse WebSphere Portal Server支持(二)
MyEclipse个人授权 折扣低至冰点!立即开抢>> [MyEclipse最新版下载] 三.支持WebSphere Portal部署 当您为WebSphere Portal 7.0或8. ...
- 201621123010《Java程序设计》第12周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 面向系统综合设计-图书馆管理系统或购物车 使用流与文件改造你的图书馆管理系统或购物车. 2.1 简述如何 ...
- Mysql命令insert into:向表中插入数据(记录)
insert into命令用于向表中插入数据. insert into命令格式:insert into <表名> [(<字段名1>[,..<字段名n > ])] v ...
- HDU 1588 Gauss Fibonacci(矩阵快速幂)
Gauss Fibonacci Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 负margin
负margin理论: 何谓参考线?参考线就是 margin移动的基准点,此基准点相对于box(自身)是静止的.而margin的数值,就是box相对于参考线的位移量. 一个完整的margin属性是这么写 ...
- linux平台程序高精度延时问题select-usleep等
前言 微秒级别的延时... 1.能用 #include <unistd.h> int usleep(useconds_t usec); 微秒级:1/10^-6 2 ...
- java语法基础练习
1.阅读示例: EnumTest.java,并运行.分析结果 代码: public class EnumTest { public static void main(String[] args) { ...
- 【洛谷P1338】末日的传说
https://www.luogu.org/problemnew/show/P1338 [题目大意:从1到n的连续自然数,求其逆序对数为m的一个字母序最小的排列.] 最开始的思路是想从逆序对数入手,然 ...