VLD内存工具可以为每个泄漏的块提供完整的堆栈跟踪,包括源文件和行号信息,从而快速找到内存泄漏点。

注:「仅支持Windows平台。」

0x01 下载安装

  • 从VLD项目维护者的github下载exe执行文件,Qt君下载的是2.5.1版本。下载地址:
https://github.com/KindDragon/vld/releases
  • 安装VLD工具。

25770f00af4e0211240ef6461690173f.png

  • 选择默认路径,一直默认选择即可。

7a18345d790d9314b83e73bc4465347f.png

0x02 使用

  • 找到VLD安装目录下复制以下三个文件夹到项目文件中,并在项目中引用头文件和库文件:

06775e56c7807cff571cc9fb668e401d.png

  • Qt君创建一个普通的Qt项目,其目录结构为:

C:\users\LeakDetectorDemo
└─ThirdPart
    └─vld-2.5.1
        ├─bin
        │  ├─Win32
        │  └─Win64
        ├─include
        └─lib
            ├─Win32
            └─Win64
  • 项目文件添加以下代码:
win32 {
    CONFIG(debug, debug|release) {
        vld_path = $$PWD/ThirdPart/vld-2.5.1
        !contains(QMAKE_HOST.arch, x86_64) {
            message("x86_32 build")
            LIBS += -L$$vld_path/lib/Win32
        }
        else {
            message("x86_64 build")
            LIBS += -L$$vld_path/lib/Win64
        }

        INCLUDEPATH += $$vld_path/include
        LIBS += -lvld
    }
}

  在main.cpp中添加#include 后以调试模式运行即可检测内存泄漏。

0x03 如何查找内存泄漏点

  • 例子代码:
#include 

int main(int argc, char *argv[]){
    int *a = new int(10); /* 模拟内存泄漏点 */
    return 0;
}
  • 调试模式运行后输出(省略了无关信息):
main.cpp (5): LeakDetectorDemo.exe!main() + 0xA bytes
Visual Leak Detector detected 1 memory leak (56 bytes).

  「可以看到提示了一个内存泄漏点,在main.cpp的第五行。」

  • 修正后的代码:
#include 

int main(int argc, char *argv[]){
    int *a = new int(10);
    delete a;
    return 0;
}
  • 运行完成后输出(省略了无关信息):
No memory leaks detected.

0x04 关于更多

  • 项目网站:
https://github.com/KindDragon/vld
  • 详细使用文档:
https://github.com/KindDragon/vld/wiki
  • 本文例子和vld-2.5.1.exe安装文件可在群文件获取,公众号聊天界面回复"入群"获取群号。
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐