内存泄漏

一般指堆的内存泄漏,简单来说就是已申请的内存空间没有被正确释放。

避免内存泄露的几种方式

  • 计数法:使用new或者malloc时,让该数+1,delete或free时,该数-1,程序执行完打印这个计数,如果不为0则表示存在内存泄露
  • 一定要将基类的析构函数声明为虚函数
  • 对象数组的释放一定要用delete []
  • 有new就有delete,有malloc就有free,保证它们一定成对出现

检测工具

  • Linux下可以使用Valgrind工具
  • Windows下可以使用CRT库

在 Linux 或 macOS 下,有多种工具可以用来检测内存泄漏。以下是一些常用的方法:

  1. mtrace:mtrace 是 GNU Glibc 自带的内存问题检测工具,它可以用来协助定位内存泄露问题。mtrace 的基本设计原理为设计一个函数 void mtrace(),函数对 libc 库中的 malloc/free 等函数的调用进行追踪,由此来检测内存是否存在泄漏的情况。使用 mtrace 时,需要在代码中包含 <mcheck.h>,并在程序开始时调用 mtrace(),在程序结束时调用 muntrace()。同时,需要设置环境变量 MALLOC_TRACE 来指定日志文件的路径。
#include <mcheck.h>
#include <stdlib.h>

int main() {
    mtrace();  // 开始跟踪

    char *p = (char *)malloc(100);
    free(p);
    p = NULL;
    p = (char *)malloc(100);

    muntrace();  // 结束跟踪,并生成日志信息
    return 0;
}
  1. Valgrind1:Valgrind 是一套开源的仿真调试工具集合,其中的 Memcheck 工具可以用来检测程序中出现的内存问题,包括内存泄漏。使用 Valgrind 进行内存泄漏检测时,只需要在命令行中使用 valgrind --leak-check=yes your_program 命令运行你的程序即可。

  2. ps 命令2:在 Linux 平台,可以使用 ps 命令来监视内存的使用,观测指定进程的 VSZ 值,从而发现可能的内存泄漏。

 
posted @ 2023-12-09 21:22  ponder776  阅读(7)  评论(0编辑  收藏  举报