在学习FPS3000人脸关键点定位算法时,发现github上的源码,存在大量的内存泄漏问题,在训练的时发现内存一直在增长,测试的时候也存在内存无法彻底释放的问题。

一直以为是存放模型参数vector<class>结构的问题, 采用以下方法手动释放,仍然无法解决问题。

  1.  
    vector<class> regressors_;
  2.  
    regressors_.clear();
  3.  
    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模式下在代码中添加如下代码:

  1.  
    #include <stdlib.h>
  2.  
    #include <crtdbg.h>
  3.  
     
  4.  
     
  5.  
    #ifdef _DEBUG
  6.  
    #define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
  7.  
    #endif
  8.  
     
  9.  
    void EnableMemLeakCheck()
  10.  
    {
  11.  
    int tmpFlag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
  12.  
    tmpFlag |= _CRTDBG_LEAK_CHECK_DF;
  13.  
    _CrtSetDbgFlag(tmpFlag);
  14.  
    }
  15.  
     
  16.  
    using namespace std;
  17.  
    int main()
  18.  
    {
  19.  
    EnableMemLeakCheck();
  20.  
    //_CrtSetBreakAlloc(3558059);
  21.  
    此处添加自己的代码
  22.  
    }

二、然后编译执行程序,如果代码中存在内存泄漏,则在程序终止时,输出端口看到如下内容:

  1.  
    线程 0x1b24 已退出,返回值为 0 (0x0)。
  2.  
    Detected memory leaks!
  3.  
    Dumping objects ->
  4.  
    {3558059} normal block at 0x0000000007F11480, 62544 bytes long.
  5.  
    Data: < y W] > CC AD FF AD AA 1B A2 BE 79 9E 57 5D E2 8E FE BE
  6.  
    {3558049} normal block at 0x0000000007CB98F0, 88 bytes long.
  7.  
    Data: < > 0C 00 00 00 CD CD CD CD CD CD CD CD CD CD CD CD
  8.  
    {3558025} normal block at 0x0000000007EF1A90, 62544 bytes long.
  9.  
    Data: < FR > .u ?> E2 CB 46 52 DD 11 E1 3E CB C9 93 2E 75 BE 00 3F
  10.  
    {3558015} normal block at 0x0000000007CBA170, 88 bytes long.
  11.  
    Data: < > 0C 00 00 00 CD CD CD CD CD CD CD CD CD CD CD CD

从以上log中可以看到3558059的地方存在内存泄漏,那我们可以把main()函数中的这个函数去掉注释,

  1.  
    int main()
  2.  
    {
  3.  
    EnableMemLeakCheck();
  4.  
    _CrtSetBreakAlloc(3558059);
  5.  
    此处添加自己的代码
  6.  
    }

然后重新编译并执行程序,代码就会run到内存泄漏的地方就停下来。

此法对于查找内存泄漏非常方便。

在VS2013平台下如何快速解决c++代码内存泄漏问题的更多相关文章

  1. Release编译模式下,事件是否会引起内存泄漏问题初步研究

    题记:不常发生的事件内存泄漏现象 想必有些朋友也常常使用事件,但是很少解除事件挂钩,程序也没有听说过内存泄漏之类的问题.幸运的是,在某些情况下,的确不会出问题,很多年前做的项目就跑得好好的,包括我也是 ...

  2. 【转】Windows下Python快速解决error: Unable to find vcvarsall.bat

    转自:http://blog.csdn.net/sad_sugar/article/details/73743863 系统配置:Windows10 x64, Visual Studio 2017, P ...

  3. Android平台下使用lua调用Java代码经验总结

    动态语言以其执行的灵活性,可配置性.方便调试能够为开发带来极大的方便.假设用好了.能够极大的提高开发的效率. 怪不得像游戏开发这样复杂的软件开发里没有不集成脚本语言的. 当中,lua以其小巧,灵活.方 ...

  4. Windows下使用Gflags和UMDH查找内存泄漏

    GFlags和UMDH与WinDbg一样,都是Debugging Tools for Windows里的工具. 1.设置符号路径 去微软官网下载对应的操作系统的符号安装文件,并安装到某个目录,如C:\ ...

  5. web 开发之js---理解并解决IE的内存泄漏方式

    程序当中任何编程内存操作不当都会导致内存泄漏 http://wenku.baidu.com/link?url=8ba4UIn1aaevxTagH-F4vID79-bAfxdcLdeujGFn7PBnv ...

  6. Android性能优化之利用Rxlifecycle解决RxJava内存泄漏

    前言: 其实RxJava引起的内存泄漏是我无意中发现了,本来是想了解Retrofit与RxJava相结合中是如何通过适配器模式解决的,结果却发现了RxJava是会引起内存泄漏的,所有想着查找一下资料学 ...

  7. AutoDispose代替RxLifecycle优雅的解决RxJava内存泄漏问题

    使用过Rxjava的小伙伴都知道,在使用RxJava时如果处理不当,很可能会产生内存泄漏的问题. 我们使用rxjava最大的原因是响应式编程使我们的异步操作代码变得很优雅,在Android中,也使线程 ...

  8. VS2013/2012 下无法打开 源 文件“stdafx.h”的解决方法

    VS2013/2012下代码一写上去保存就报错了,下方提示无法打开 源 文件“stdafx.h” 如图: 百度了一下,对于VS2010有这样的方法可以解决: 在项目属性中展开C/C++,选择常规,在附 ...

  9. windows平台下编辑的内容传到linux平台出现中文乱码的解决办法

    现象说明:在windows下编辑的内容,上传到linux平台下出现中文乱码.如下: 在windows平台编写haha.txt文件,内容如下: 上传到linux平台,出现中文乱码,如下: 基本上面出现的 ...

随机推荐

  1. golang模拟动态高优先权优先调度算法

    实验二  动态高优先权优先调度 实验内容 模拟实现动态高优先权优先(若数值越大优先权越高,每运行一个时间单位优先权-n,若数值越小优先权越高,没运行一个时间单位优先权+n),具体如下: 设置进程体:进 ...

  2. JS之Callback function(回调函数)

    JS中的回调函数: 1.概念: 函数a有一个参数,这个参数是个函数b,当函数a执行完以后执行函数b,那么这个过程就叫回调,即把函数作为参数传入到另一个函数中,这个函数就是所谓的回调函数. 2.举例: ...

  3. 获取URL中的链接(可中文也可英文)

    //既能获取中文url也能英文function getUrlParam(key) { // 获取参数 var url = window.location.search; // 正则筛选地址栏 var ...

  4. struts2 的学习

    1.struts.xml 中的action不是代表一个action类(控制器),而是代表一次访问,所以action的name属性和访问路径有关.配置文件中的package的namespace属性其实就 ...

  5. ORA-01034:Oracle not available

    ORA-01034:Oracle not available 问题描述:ora-01034常与ora-27101同时出现,都是在登录数据库的时候报该错误 错误原因:出现ORA-01034和ORA-27 ...

  6. DevExpress v18.1新版亮点——WinForms篇(八)

    用户界面套包DevExpress v18.1日前终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress WinForms v18.1 的新功能,快来下载试用新版本! ...

  7. 利用 gulp 来合并seajs 的项目

    gulp-seajs-transport 和 gulp-seajs-concat这两个gulp插件 gulp-seajs-transpor 这个插件这样是给每个js模块 标示 模块名称 gulp-se ...

  8. 接下来将介绍C#如何设置子窗体在主窗体中居中显示,本文提供详细的操作步骤,需要的朋友可以参考下

    接下来将介绍C#如何设置子窗体在主窗体中居中显示,本文提供详细的操作步骤,需要的朋友可以参考下 其实表面上看是很简单的 开始吧,现在有两个窗体Form1主窗体,Form2子窗体 而且我相信大部分人都会 ...

  9. python两个子线程通过queue通信

    SocketServer端代码 #!/usr/bin/env python import threading import SocketServer import time import queue ...

  10. NBUT 1218 You are my brother 2010辽宁省赛

    Time limit 1000 ms Memory limit 131072 kB Little A gets to know a new friend, Little B, recently. On ...