内存泄漏检测

72 阅读1分钟

单文件内存检测使用的代码

当是单文件的时候,我们只需要把内存检测的相关代码复制到文件中即可。

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

int flag = 1;  // 定义一个flag,是否开启内存泄漏检测

void *nMalloc(size_t size, const char *filename, int line)
{
  void *p = malloc(size);

  char buff[128] = {0};

  if (flag)
  {
    // 分配内存的时候创建一个文件,
    char buf[128] = {0};
    snprintf(buff, 128, "./mem/%p.mem", p);

    FILE *fp = fopen(buff, "w");

    if (!fp)
    {
      free(p);
      return NULL;
    }

    fprintf(fp, "[+]%s:%d ,addr: %p, size: %ld", filename, line, p, size);
    fflush(fp);
    fclose(fp);
  }

  return p;
}

void nFree(void *ptr)
{

  if (flag)
  {
    char buff[128] = {0};
    snprintf(buff, 128, "./mem/%p.mem", ptr);
    // 释放内存时候删除文件
    if (unlink(buff) < 0)
    {
      printf("double free: %p", ptr);
      return;
    }
  }

  return free(ptr);
}

// __FILE__ 打印具体是哪个文件, __LINE__ 打印是哪一行
#define malloc(size) nMalloc(size, __FILE__, __LINE__)
#define free(ptr) nFree(ptr)

int main()
{

  void *p1 = malloc(5);
  void *p2 = malloc(10);
  void *p3 = malloc(15);
  void *p4 = malloc(10);

  free(p1);
  free(p3);
  free(p4);
}

image.png