本文简要描述一下在Qt应用中使用VLD来检测内存泄露。本次测试环境:QtCreator2.3 + Qt4.7.4-vs2008 + VS2008 Express.

1、下载并安装:VLD-2.2: http://vld.codeplex.com/

链接:http://vld.codeplex.com/releases/70398/download/261406

假定安装到c:/dev/vld-2.2目录下。

注:vld最初发表在codeproject.com,这个版本太老了。检测不准,不能使用。

2、创建测试项目:使用QtCreator创建一个Qt GUI项目。

修改.pro文件,添加如下内容:

  1. win32 {
  2. CONFIG(debug, debug|release) {
  3. #        DEFINES += _DEBUG
  4. # vld 2.2 downloaded from http://vld.codeplex.com/
  5. VLD_PATH = c:/dev/vld-2.2
  6. INCLUDEPATH += $VLD_PATH/include
  7. LIBS += -L$VLD_PATH/lib/Win32 -lvld
  8. }
  9. }

修改main.cpp文件,在main函数上面添加以下代码:

  1. #ifdef _DEBUG
  2. #include "vld.h"
  3. #endif

3、进行测试:

测试1:在MainWindow的构造函数中添加一行代码:

  1. new QWidget(this); // 不会泄露

编译运行,在QtCreator的应用程序输出窗口中将会有类似下面的内容:

  1. Visual Leak Detector Version 2.2 installed.
  2. Visual Leak Detector Version 2.2 installed.
  3. No memory leaks detected.
  4. Visual Leak Detector is now exiting.

以上表示没有发现内存泄露。

(初次运行时可能无法运行,这是因为找不到vld的dll文件。将C:\dev\vld-2.2\bin\Win32目录下的内容拷贝到PATH环境变量中所列的某个目录即可)

测试2:再添加一行代码:

  1. new QWidget(0); // 这个会泄露

再次编译运行,结果为:

  1. Visual Leak Detector Version 2.2 installed.
  2. WARNING: Visual Leak Detector detected memory leaks!
  3. ---------- Block 8 at 0x00EF14E0: 20 bytes ----------
  4. Call Stack:
  5. e:\works\test_vld_qt\mainwindow.cpp (18): test_vld_qt.exe!MainWindow::MainWindow + 0x7 bytes
  6. e:\works\test_vld_qt\main.cpp (10): test_vld_qt.exe!main + 0xA bytes
  7. e:\qt\4.7.4-vs2008\src\winmain\qtmain_win.cpp (131): test_vld_qt.exe!WinMain + 0x12 bytes
  8. f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (578): test_vld_qt.exe!__tmainCRTStartup + 0x35 bytes
  9. f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (403): test_vld_qt.exe!WinMainCRTStartup
  10. 0x7C817067 (File and line number not available): kernel32.dll!RegisterWaitForInputIdle + 0x49 bytes
  11. Data:
  12. 8C 8A 40 00    F8 81 F1 00    68 8A 40 00    00 00 CD CD     ..@..... h.@.....
  13. B0 82 F1 00                                                  ........ ........
  14. Visual Leak Detector detected 1 memory leak (56 bytes).
  15. Largest number used: 432 bytes.
  16. Total allocations: 432 bytes.
  17. Visual Leak Detector is now exiting.

这次检测到了内存泄露。

小结:如上所示,使用vld检测内存泄露很容易,美中不足的是只能使用VC++编译器。尽管如此,我们也可以用它来在Win32下检测内存泄露,然后再使用其它编译器在其它平台上进行编译发布。

Qt应用中检测内存泄露——VLD的更多相关文章

  1. 检测内存泄露:Instruments中的Leaks

    前言 如果要检测内存泄露,我们会使用Xcode7自带的Instruments中的Leaks工具来检测. 现在的开发环境是ARC,所以很少会出现内存泄漏的情况. 不过我们一定要养好码代码的规范性. 例如 ...

  2. Android内存优化8 内存检测工具2 LeakCanary——直白的展现Android中的内存泄露

    之前碰到的OOM问题,终于很直白的呈现在我的眼前:我尝试了MAT,但是发现不怎么会用.直到今天终于发现了这个新工具: 当我们的App中存在内存泄露时会在通知栏弹出通知: 当点击该通知时,会跳转到具体的 ...

  3. 在Windows中 , 如何用leakdiag “自动”检测内存泄露 (自动记录日志)

    一.基本用法 在LeakDiag中选择aaa.exe 然后选择Windows Heap Allocator来跟踪heap的使用,按start开始,等一会按log,然后再stop 会在c:\leakdi ...

  4. 使用新版Android Studio检测内存泄露和性能

    内存泄露,是Android开发者最头疼的事.可能一处小小的内存泄露,都可能是毁于千里之堤的蚁穴.  怎么才能检测内存泄露呢?网上教程非常多,不过很多都是使用Eclipse检测的, 其实1.3版本以后的 ...

  5. Android DDMS检测内存泄露

    Android DDMS检测内存泄露 DDMS是Android开发包中自带工具,可以测试app性能,用于发现内存问题. 1.环境搭建 参考之前发的Android测试环境搭建相关文章,这里不再复述: 2 ...

  6. 使用LeakCanary检测内存泄露 翻译 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  7. 利用Instrument Leak来发现App中的内存泄露

    XCode提供了一组用于检测内存,调试动画,布局等的工具.对于调试一些性能问题,内存问题非常方便.这里我们使用Leak来发现代码中的内存泄露. 在Leak中启动我们的应用开始监控: 注意,在监控的时候 ...

  8. Android Studio检测内存泄露和性能

    韩梦飞沙 yue31313 韩亚飞 han_meng_fei_sha 313134555@qq.com 首先需要明白一个概念, 内存泄露就是指,本应该回收的内存,还驻留在内存中. 一般情况下,高密度的 ...

  9. xcode怎样分析检测内存泄露(iOS)

    虽然iOS 5.0版本之后加入了ARC机制,由于相互引用关系比较复杂时,内存泄露还是可能存在.所以了解原理很重要. 这里讲述在没有ARC的情况下,如何使用Instruments来查找程序中的内存泄露, ...

随机推荐

  1. MySql数据库1【概念】

    [mysql] mysql是目前最主流的跨平台.开放源代码的关系型数据库,由瑞曲的mysql ab公司开发,已经被SUN公司收购,标识是一只名为sakila的海豚,代表mysql的速度.能力.精确优秀 ...

  2. 【Windows核心编程】Windows常见数据类型

    一,常见数据类型 WORD:               16位无符号整形数据 DWORD:             32位无符号整型数据(DWORD32) DWORD64:         64位无 ...

  3. 转:gpio_request

    今天再次学习SD卡驱动,遇到pgio_request这个函数,始终不知道其什么意思,看了几遍源代码才有了点感觉.现将其关键部分再此说明一下,以备自己以后复习,或是路客参考. 一般gpio_reques ...

  4. 正则表达式:根据逗号解析CSV并忽略引号内的逗号

    需求:解析CSV文件并忽略引号内的逗号 解决方案: public static void main(String[] args) { String s = "a,b,c,\"1,0 ...

  5. 尼玛的,不学ORACLE RAC就不能叫高大上啊

    刚才趁这段时间和机会,进去好好套弄一下. 我看不得会ORACLE人的嘴脸,于是,,,,我想试试~~~

  6. NXP LPC11xx I2C Slave 从机程序

    /**************************************************************************** * $Id:: i2cslave.c 363 ...

  7. C语言宏定义使用技巧

    写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性 等等.下面列举一些成熟软件中常用得宏定义...... 1.防止一个头文件被重复包含 #ifndef COMDEF_ ...

  8. 海量日志数据提取某日访问百度次数最多的那个IP的Java实现

    海量日志数据提取某日访问百度次数最多的那个IP的Java实现 前几天在网上看到july的一篇文章<教你如何迅速秒杀掉:99%的海量数据处理面试题>,里面说到百度的一个面试题目,题目如下: ...

  9. C++中的 new / delete

    new的3种形态: new operator , operator new , placement new 1.new operator: new操作符,像 + - * / && . ...

  10. [LeetCode#136, 137]Single Number, Single Number 2

    The question: Single Number Given an array of integers, every element appears twice except for one. ...