• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C++程序检测内存泄漏的方法分享

C++程序检测内存泄漏的方法分享

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c++程序设计,c++程序设计语言,c++程序设计 谭浩强,c++程序设计软件,c++程序下载等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

一、前言

在Linux平台上有valgrind可以非常方便的帮助我们定位内存泄漏,因为Linux在开发领域的使用场景大多是跑服务器,再加上它的开源属性,相对而言,处理问题容易形成“统一”的标准。而在Windows平台,服务器和客户端开发人员惯用的调试方法有很大不同。下面结合我的实际经验,整理下常见定位内存泄漏的方法。

注意:我们的分析前提是Release版本,因为在Debug环境下,通过VLD这个库或者CRT库本身的内存泄漏检测函数能够分析出内存泄漏,相对而言比较简单。而服务器有很多问题需要在线上并发压力情况下才出现,因此讨论Debug版调试方法意义不大。

二、对象计数

方法:在对象构造时计数++,析构时--,每隔一段时间打印对象的数量

优点:没有性能开销,几乎不占用额外内存。定位结果精确。

缺点:侵入式方法,需修改现有代码,而且对于第三方库、STL容器、脚本泄漏等因无法修改代码而无法定位。

三、重载new和delete

方法:重载new/delete,记录分配点(甚至是调用堆栈),定期打印。

优点:没有看出

缺点:侵入式方法,需将头文件加入到大量源文件的头部,以确保重载的宏能够覆盖所有的new/delete。记录分配点需要加锁(如果你的程序是多线程),而且记录分配要占用大量内存(也是占用的程序内存)。

四、Hook Windows系统API

方法:使用微软的detours库,hook分配内存的系统Api:HeapAlloc/HeapRealloc/HeapFree(new/malloc的底层调用),记录分配点,定期打印。

优点:非侵入式方法,无需修改现有文件(hook api后,分配和释放走到自己的钩子函数中),检查全面,对第三方库、脚本库等等都能统计到。

缺点:记录内存需要占用大量内存,而且多线程环境需要加锁。

五、使用DiagLeak检测

微软出品的内存泄漏分析工具,原理同hookapi方式。配合LDGraph可视化展示内存分配数据,更方便查找泄漏。

1.在IDE工程选项里面配置Release版本也生成调试信息,发布时,将pdb文件和exe文件一起发布。

2.程序运行后,打开LeakDiag,设置Symbol path

3.定期Log下目标进程的内存分配情况,通过LDGraph打印分配增长情况,来发现内存泄漏。

优点:同hookapi方法,非侵入式修改,无需做任何代码改动。跟踪全面。可视化分析堆栈一览无余!

缺点:对性能有影响,hook分配加锁,遍历堆栈。但是不会占用目标进程的自身内存。

六、总结

对于线上生产环境,建议大对象用计数来判断,定位快速准确,几乎无性能开销。在对外测试阶段,使用LeakDiag辅助分析,因为此时并发压力还不是太大,性能开销还是可以承受。在线上大规模应用阶段,通过HookApi的方法,结合GM指令控制部分时间段的检测,这样可以把对玩家的影响(服务器性能下降导致延迟)降到最低。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • c++ 端口扫描程序实现案例
  • C++ 将文件数据一次性加载进内存实例代码
  • C++语言数据结构 串的基本操作实例代码
  • C++中实现把表的数据导出到EXCEL并打印实例代码
  • C++程序设计-五子棋
  • C++语言实现hash表详解及实例代码
  • C++语言 STL容器list总结
  • VC++实现文件与应用程序关联的方法(注册表修改)
  • C/C++程序编译流程详解
  • C++基础学生管理系统

相关文章

  • 2017-05-28C语言中char*和char[]用法区别分析
  • 2017-05-28C 语言restrict 关键字的使用浅谈
  • 2017-05-28C++中关键字Struct和Class的区别
  • 2017-05-28C语言 变量详解及示例代码
  • 2017-05-28C++实现位图排序实例
  • 2017-05-28C++中函数的默认参数详细解析
  • 2017-05-28如何求连续几个数之和的最大值
  • 2017-05-28C++中构造函数重载
  • 2017-05-288皇后问题的解法实例代码
  • 2017-05-28深入理解c++指针的指针和指针的引用

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 深入C++浮点数无效值定义与判定的解决办法
    • 主流操作系统平台的宏定义
    • C++ 使用Json封装数据和解析数据
    • 用c++实现x的y次幂的代码
    • C++中四种加密算法之AES源代码
    • C语言 指针与数组的详解及区别
    • C语言之没有main函数的helloworld示例
    • 基于c++中的默认拷贝函数的使用详解
    • C语言实现电子邮件地址验证程序
    • 利用C语言实现HashTable

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有