C/C++的内存泄漏检测工具Valgrind memcheck的使用经历

Linux下的Valgrind真是利器啊(不知道Valgrind的请自觉查看参考文献(1)(2)),帮我找出了不少C++中的内存管理错误,前一阵子还在纠结为什么VS 2013下运行良好的程序到了Linux下用g++编译运行却崩溃了,给出一堆汇编代码也看不懂。久久不得解过后,想想肯定是内存方面的错误,VS在这方面一般都不检查的,就算你的程序千疮百孔,各种内存泄露、内存管理错误,只要不影响运行,没有读到不该读的东西VS就不会告诉你(应该是VS内部没实现这个内存检测功能),因此用VS写出的程序可能不是完美或健壮的。

更新:感谢博客园好心网友@shines77的热心推荐,即VS中有内存泄漏检测工具插件VLD(Visual Leak Detector),需要下载安装,安装方法请看官方介绍,使用非常简单,在第一个入口文件里加上#include <vld.h>就可以了,检测报告在输出窗口中。我安装使用了下,不知道是安装错误还是什么,无论程序有无内存泄露,输出都是“No memory leaks detected.”

下面是我通过 Valgrind第一次检测得到的结果和一点点修改后得到的结果(还没改完,所以还有不少内存泄露问题……):

第一次检测结果:惨不忍睹,因为程序规模有些大。

根据提示一点点修改过后,虽然还有个别错误和内存泄露问题,但还在修改中,至少已经能成功运行了……

真感谢Valgrind帮我成功找出了一堆内存问题,查找过程中也为自己犯的低级错误而感到羞愧,所以记录下来以便谨记。

1. 最多最低级的错误:不匹配地使用malloc/new/new[] 和 free/delete/delete[]

这样的错误主要源于我对C++的new/new[]、delete/delete[]机制不熟悉,凡是new/new[]分配内存的类型变量我一概用delete进行释放,或者有的变量用malloc进行分配,结果释放的时候却用delete,导致申请、释放很多地方不匹配,很多内存空间没能释放掉。为了维护方便,我后来一律使用new/new[]和delete/delete[],抛弃C中的malloc和free。

如果将用户new的类型分为基本数据类型和自定义数据类型两种,那么对于下面的操作相信大家都很熟悉,也没有任何问题。

(1)基本数据类型

一维指针:

// 申请空间
int *d = new int[5];

// 释放空间
delete[] d;

二维指针:

// 申请空间
int **d = new int*[5];
for (int i = 0; i < 5; i++)
    d[i] = new int[10];

// 释放空间
for (int i = 0; i < 5; i++)
    delete[] d[i];
delete[] d;

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索内存
, delete
, leaks
, new
, 数据类型
, 错误
, c/c++ vs
, vs2013 局部变量窗口
, 检测
, valgrind
, new 内存 内存泄露
, new delete
, c++内存泄露
strcat内存泄露free
valgrind memcheck、valgrind 内存泄漏、valgrind 内存泄露、valgrind 内存越界、valgrind 内存分配,以便于您获取更多的相关知识。

时间: 2024-11-02 01:32:35

C/C++的内存泄漏检测工具Valgrind memcheck的使用经历的相关文章

Linux C/C++内存泄漏检测工具:Valgrind

Valgrind 是一款 Linux下(支持 x86.x86_64和ppc32)程序的内存调试工具,它可以对编译后的二进制程序进行内存使用监测(C语言中的malloc和free,以及C++中的new和delete),找出内存泄漏问题. Valgrind 中包含的 Memcheck 工具可以检查以下的程序错误: 使用未初始化的内存 (Use of uninitialised memory) 使用已经释放了的内存 (Reading/writing memory after it has been f

Cocos开发中性能优化工具介绍之Visual Studio内存泄漏检测工具——Visual Leak Detector

那么在Windows下有什么好的内存泄漏检测工具呢微软提供Visual Studio开发工具本身没有什么太好的内存泄漏检测功能我们可以使用第三方工具Visual Leak Detector以下简称vld. vld工具是VC++环境下一款小巧易用.免费开源的内存泄漏检测工具vld可以显示导致内存泄漏的完整内存分配调用堆栈.vld的检测报告能够对每个内存泄漏点提供完整的堆栈跟踪并且包含其源文件及行号信息. 安装过程是先在到地址http://vld.codeplex.com/下载vld安装文件然后进行

强力推荐一个内存检测工具valgrind

     今天公司一同事介绍了一个内存检测工具Valgrind,使用过后觉得非常实用,跟rational 的purify有的一比. 一.介绍     Valgrind软件包是open source的,可以在www.valgrind.org下载到,并有很详细的用户文档.包含很多工具,其中一个最有用的就是内存检测工具(Memcheck),可以检测许多通常的内存错误如:     1.内存越界访问     2.使用未初始化的变量     3.错误的释放内存,比如两次释放统一内存块 4.内存泄露 二.准备

Linux下c++程序内存泄漏检测代码范例

Linux下对于程序内存泄漏检测的方法很多,最常用的的莫过于使用valgrind工具.但是valgrind相当于让程序在虚拟机中运行,会带 来较大的系统资源开销,还会对程序的运行效率产生较大影响,对于那种资源占用大的程序,如果需要长时间运行才能暴露的泄漏问题,它就显得不太好用. linux下的c++程序中自己实现一个轻量级的泄漏检测代码其实是比较方便的,下面我就给出一个简单的范例,并作简单的说明.当然,我们还是应该提倡使用共享指针,用共享指针自动管理内存可以避免内存泄漏这样的不必要的麻烦. 基本

Visual C++内存泄露检测工具(VLD)

简述 C/C++ 程序越复杂,内存的管理显得越重要,稍有不慎就会出现泄漏.如果内存泄漏不是很严重,在短时间内对程序不会有太大影响,这也使得内存泄漏问题有很强的隐蔽性,不易被发现.然而不管内存泄漏多么轻微,当程序长时间运行时,其破坏力是惊人的 - 从性能下降到内存耗尽,甚至会影响其他程序的正常运行. 简述 VLD 下载安装 使用 Visual Studio Qt 更多参考 VLD VLD(Visual Leak Detector)是一款用于 Visual C++ 的免费内存泄露检测工具.相比较其它

GDI泄漏和内存泄漏 检测方法

GDI泄漏检测方法: 1.检查是否GetWindowDC(),后是否有 ReleaseDC() 2.CFont *pOldFont=pDC->SelectObject(&m_Font): 后是否有pDC->SelectObject(pOldFont); 3.CBitmap bmp;  bmp.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height()); 后是否记得bmp.DeleteObject();   内

怎么用弱引用实现内存泄漏检测

在Java中,引用分为强引用.软引用.弱引用和虚引用四种. 强引用,代码中普遍存在的形式,例如常见的普通类new出对象后的引用.GC不会回收强引用的对象. 软引用,软引用对象会在内存溢出异常之前进行回收,也就是说在内存富裕的情况下GC不回收软引用.它可通过SoftReference类实现. 弱引用,弱引用对象会在下一次GC时被回收,也就是说不管内存富不富裕,当GC时都会回收弱引用.它可通过WeakReference类实现. 虚引用,虚引用不会改变对象的生存时间,它只是让对象在被GC时能收到一个系

基于若引用的内存泄漏检测

在Java中,引用分为强引用.软引用.弱引用和虚引用四种. 强引用,代码中普遍存在的形式,例如常见的普通类new出对象后的引用.GC不会回收强引用的对象. 软引用,软引用对象会在内存溢出异常之前进行回收,也就是说在内存富裕的情况下GC不回收软引用.它可通过SoftReference类实现. 弱引用,弱引用对象会在下一次GC时被回收,也就是说不管内存富不富裕,当GC时都会回收弱引用.它可通过WeakReference类实现. 虚引用,虚引用不会改变对象的生存时间,它只是让对象再被GC时能收到一个系

内存检测工具Valgrind

Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合.Valgrind由内核(core)以及基于内核的其他调试工具组成.内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具:而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务.Valgrind的体系结构如下图所示: Valgrind包括如下一些工具: Memcheck.这是valgrind应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝