千家信息网

C++中怎么检查内存泄露

发表于:2024-11-11 作者:千家信息网编辑
千家信息网最后更新 2024年11月11日,这篇文章主要介绍了C++中怎么检查内存泄露的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++中怎么检查内存泄露文章都会有所收获,下面我们一起来看看吧。一、前言在Linu
千家信息网最后更新 2024年11月11日C++中怎么检查内存泄露

这篇文章主要介绍了C++中怎么检查内存泄露的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++中怎么检查内存泄露文章都会有所收获,下面我们一起来看看吧。

一、前言

在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分配加锁,遍历堆栈。但是不会占用目标进程的自身内存。

关于"C++中怎么检查内存泄露"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"C++中怎么检查内存泄露"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。

内存 分配 方法 检查 C++ 优点 文件 缺点 分析 定位 代码 堆栈 对象 情况 服务器 知识 程序 服务 内容 函数 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 信息安全网络安全协议 单片机软件开发是什么 哪家社交软件开发公司好 数据库长整型怎么写 微信小程序读取数据库 2007数据库实例 数据库索引超出数据界限 宁夏广播电视台软件开发工程师 怎么把图片插入数据库表中 35岁女人做软件开发 辽宁创新软件开发服务诚信互利 国防科技大学网络安全技术怎样 天翼云服务器安全组怎么开放 怎么找网络安全员 剪辑软件开发实例 虹口区节能软件开发服务设计标准 数据库表属性在哪里 三军网络安全 天津定制网络技术开发商家 我国的网络安全法共有几张 海南省金财网络技术有限公司 软件开发中的非功能性需求 信息中心服务器名称怎么填 内网服务器丢包 衡阳市网络安全监察大队周文 nb-iot网络技术 河南数据库技术公司 软件开发一般用多大内存合适 软件开发地图有哪些类型 厦门首届网络安全宣传周时间
0