IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> Qt使用Valgrind分析内存泄漏 -> 正文阅读

[C++知识库]Qt使用Valgrind分析内存泄漏

Valgrind安装和使用

Valgrind是linux下一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具包,包含七个工具。
我们使用其中的Memcheck来检测程序中出现的内存问题。

sudo apt-get install valgrind#安装
valgrind --version#查看版本

QT集成了Valgrind工具,工程编译好以后,在QT菜单栏–Analyze–Valgrind内存分析器,点击以内存分析(Memcheck)模式启动程序,程序运行一段时间关闭,Memcheck会记录内存异常列表,包含报错信息和简单调用栈。
在这里插入图片描述

使用了不匹配的方式释放内存

代码示例,new出来的要用delete释放,malloc出来的要用free释放,new出来的数组要用delete []释放。

//示例a
    int lena = 10;
    int* pa = new int[lena];
    delete pa;//Mismatched free() / delete / delete [],应该使用 delete [] pa;

//示例b
    int* pb = new int;
    free(pb);//Mismatched free() / delete / delete [],应该使用delete pc;

//示例c
    char *pc;
    int lenc = 10;
    pc = (char *) malloc(lenc);
    delete pc;//Mismatched free() / delete / delete [],应该使用free(pd);

Memcheck错误信息,大意为使用了不匹配的释放方式,出错所在源文件,多少行等

Mismatched free() / delete / delete []MainWindow::MainWindow(QWidget*) in /home/chw/testCode/testValgring/testValgring/mainwindow.cpp:141: operator delete(void*) in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so
  2: MainWindow::MainWindow(QWidget*) in /home/chw/testCode/testValgring/testValgring/mainwindow.cpp:14
  3: main in /home/chw/testCode/testValgring/testValgring/main.cpp:9
Address 0x10b225e0 is 0 bytes inside a block of size 40 alloc'd  1: operator new[](unsigned long) in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so
  2: MainWindow::MainWindow(QWidget*) in /home/chw/testCode/testValgring/testValgring/mainwindow.cpp:13
  3: main in /home/chw/testCode/testValgring/testValgring/main.cpp:9

重复释放

    char *pd;
    int lend = 10;
    pd = (char *) malloc(lend);
    free(pd);
    free(pd);//Invalid free() / delete / delete[] / realloc(),重复释放

Memcheck错误信息,无效的释放

Invalid free() / delete / delete[] / realloc()MainWindow::MainWindow(QWidget*) in /home/chw/testCode/testValgring/testValgring/mainwindow.cpp:281: free in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so
  2: MainWindow::MainWindow(QWidget*) in /home/chw/testCode/testValgring/testValgring/mainwindow.cpp:28
  3: main in /home/chw/testCode/testValgring/testValgring/main.cpp:9
Address 0x10b23650 is 0 bytes inside a block of size 10 free'd  1: free in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so
  2: MainWindow::MainWindow(QWidget*) in /home/chw/testCode/testValgring/testValgring/mainwindow.cpp:27
  3: main in /home/chw/testCode/testValgring/testValgring/main.cpp:9
Block was alloc'd at  1: malloc in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so
  2: MainWindow::MainWindow(QWidget*) in /home/chw/testCode/testValgring/testValgring/mainwindow.cpp:26
  3: main in /home/chw/testCode/testValgring/testValgring/main.cpp:9

未释放内存

    int lene = 20;
    //80 bytes in 1 blocks are definitely lost in loss record 6,814 of 8,736
    int* pe = new int[lene];//没有释放,应该使用 delete [] pb;

Memcheck错误信息,大意为在一个块中有80个字节(20个int)肯定会丢失,new或malloc了内存,但是没有delete或free。

80 bytes in 1 blocks are definitely lost in loss record 6,820 of 8,741MainWindow::MainWindow(QWidget*) in /home/chw/testCode/testValgring/testValgring/mainwindow.cpp:311: operator new[](unsigned long) in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so
  2: MainWindow::MainWindow(QWidget*) in /home/chw/testCode/testValgring/testValgring/mainwindow.cpp:31
  3: main in /home/chw/testCode/testValgring/testValgring/main.cpp:9

使用和释放未分配内存的野指针

    char* pf;
    printf("pf=%s\n",pf);//Use of uninitialised value of size 8,使用了未分配内存的野指针
    free(pf);//Conditional jump or move depends on uninitialised value(s),Invalid free() / delete / delete[] / realloc(),释放了未分配内存的野指针

1、使用了未分配内存的野指针

Use of uninitialised value of size 8,使用了未初始化的值
  在 MainWindow::MainWindow(QWidget*) in /home/chw/testCode/testValgring/testValgring/mainwindow.cpp:341: strlen in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so
  2: __vfprintf_internal in ./stdio-common/vfprintf-internal.c:1647
  3: buffered_vfprintf in ./stdio-common/vfprintf-internal.c:2295
  4: printf in ./stdio-common/printf.c:33
  5: MainWindow::MainWindow(QWidget*) in /home/chw/testCode/testValgring/testValgring/mainwindow.cpp:34
  6: main in /home/chw/testCode/testValgring/testValgring/main.cpp:9
Uninitialised value was created by a stack allocation  1: MainWindow::MainWindow(QWidget*) in /home/chw/testCode/testValgring/testValgring/mainwindow.cpp:6

2、释放了未分配内存的野指针
Conditional jump or move depends on uninitialised value(s),条件跳转或移动依赖于未初始化的值

Conditional jump or move depends on uninitialised value(s)MainWindow::MainWindow(QWidget*) in /home/chw/testCode/testValgring/testValgring/mainwindow.cpp:351: free in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so
  2: MainWindow::MainWindow(QWidget*) in /home/chw/testCode/testValgring/testValgring/mainwindow.cpp:35
  3: main in /home/chw/testCode/testValgring/testValgring/main.cpp:9
Uninitialised value was created by a stack allocation  1: MainWindow::MainWindow(QWidget*) in /home/chw/testCode/testValgring/testValgring/mainwindow.cpp:6

Invalid free() / delete / delete[] / realloc(),无效的释放

Invalid free() / delete / delete[] / realloc()MainWindow::MainWindow(QWidget*) in /home/chw/testCode/testValgring/testValgring/mainwindow.cpp:35中
Address 0x65cd6c0 is 0 bytes inside data symbol "_IO_2_1_stdout_"  1: free in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so
  2: MainWindow::MainWindow(QWidget*) in /home/chw/testCode/testValgring/testValgring/mainwindow.cpp:35
  3: main in /home/chw/testCode/testValgring/testValgring/main.cpp:9

使用已释放的野指针

    int* pg;
    pg = new int;
    *pg=5;
    delete pg;
    printf("pg=%d\n",*pg);//Invalid read of size 4,pg已释放变成野指针,此处读取野指针

Memcheck错误信息,无效的读取,4个字节

Invalid read of size 4MainWindow::MainWindow(QWidget*) in /home/chw/testCode/testValgring/testValgring/mainwindow.cpp:411: MainWindow::MainWindow(QWidget*) in /home/chw/testCode/testValgring/testValgring/mainwindow.cpp:41
  2: main in /home/chw/testCode/testValgring/testValgring/main.cpp:9
Address 0x10b1b020 is 0 bytes inside a block of size 4 free'd  1: operator delete(void*) in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so
  2: MainWindow::MainWindow(QWidget*) in /home/chw/testCode/testValgring/testValgring/mainwindow.cpp:40
  3: main in /home/chw/testCode/testValgring/testValgring/main.cpp:9
Block was alloc'd at  1: operator new(unsigned long) in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so
  2: MainWindow::MainWindow(QWidget*) in /home/chw/testCode/testValgring/testValgring/mainwindow.cpp:38
  3: main in /home/chw/testCode/testValgring/testValgring/main.cpp:9

数组越界访问

    int *ph = (int*)malloc(5*sizeof(int));
    memset(ph,0,5*sizeof(int));
    printf("ph[5] = %d\n",ph[5]);//Invalid read of size 4,数组越界访问
    free(ph);

Memcheck错误信息,无效的读取,4个字节

Invalid read of size 4MainWindow::MainWindow(QWidget*) in /home/chw/testCode/testValgring/testValgring/mainwindow.cpp:451: MainWindow::MainWindow(QWidget*) in /home/chw/testCode/testValgring/testValgring/mainwindow.cpp:45
  2: main in /home/chw/testCode/testValgring/testValgring/main.cpp:9
Address 0x10b1b084 is 0 bytes after a block of size 20 alloc'd  1: malloc in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so
  2: MainWindow::MainWindow(QWidget*) in /home/chw/testCode/testValgring/testValgring/mainwindow.cpp:43
  3: main in /home/chw/testCode/testValgring/testValgring/main.cpp:9

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-06-26 16:45:42  更:2022-06-26 16:45:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/11 23:38:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码