Linux中内存泄漏的检测(五):记录内存泄漏的代码

int line)allocation_t *alloc = (allocation_t *)malloc(sizeof(allocation_t));

在前面几篇文章中,我们已经介绍了如何使用工具来检测Linux系统中的内存泄漏问题。但是,有时候我们需要手动记录一些代码,以便更好地分析和定位问题。本文将介绍如何在C/C++程序中手动记录内存泄漏的代码。

首先,我们需要定义一个宏来替代malloc()函数。这个宏可以用以下方式实现:

“`c

#define malloc(size) my_malloc(size, __FILE__, __LINE__)

“`

这里使用了C语言提供的预处理器功能,在程序编译时将所有出现malloc()函数调用的地方都替换为my_malloc()函数调用,并传递当前所在文件名和行号作为参数。

接下来,我们需要实现my_malloc()函数:

void *my_malloc(size_t size, const char *file, int line)

{

void *ptr = malloc(size);

if (ptr == NULL)

{

fprintf(stderr, “Memory allocation failed at %s:%dn”, file, line);

exit(EXIT_FAILURE);

}

else

// 记录分配信息

record_allocation(ptr, size, file, line);

return ptr;

}

这个函数首先调用原始的malloc()函数进行内存分配,并判断是否成功。如果失败,则输出错误信息并退出程序;否则就调用record_allocation()函数记录分配信息,并返回分配的指针。

下面是record_allocation()函数的实现:

void record_allocation(void *ptr, size_t size, const char *file, int line)

allocation_t *alloc = (allocation_t *)malloc(sizeof(allocation_t));

alloc->ptr = ptr;

alloc->size = size;

alloc->file = file;

alloc->line = line;

// 加入链表

pthread_mutex_lock(&alloc_list_mutex);

alloc->next = alloc_list;

alloc_list = alloc;

pthread_mutex_unlock(&alloc_list_mutex);

这个函数创建一个新的allocation_t结构体,用于存储分配信息。然后将该结构体添加到一个全局链表中,以便在程序退出时能够遍历该链表并输出所有未释放的内存块信息。

最后,我们需要在程序退出时输出所有未释放的内存块信息。可以使用如下代码:

void print_allocations()

allocation_t *p;

pthread_mutex_lock(&alloc_list_mutex);

for (p=alloc_list; p!=NULL; p=p->next)

fprintf(stderr, “Memory leak at %s:%d (%zu bytes)n”,

p->file, p->line, p->size);

pthread_mutex_unlock(&alloc_list_mutex);

这个函数遍历全局链表,并输出每个未释放内存块的文件名、行号和大小等信息。

最后,在main()函数中加入以下代码即可:

Linux中内存泄漏的检测(五):记录内存泄漏的代码

atexit(print_allocations);

这样,在程序退出时就会自动调用print_allocations()函数,并输出所有未释放的内存块信息。

总结一下,我们通过定义一个宏和实现三个函数,就能够手动记录C/C++程序中的内存分配信息,并在程序退出时输出所有未释放的内存块信息。这样可以帮助我们更好地定位和解决Linux系统中的内存泄漏问题。

最后附上完整代码:

#include

#include

#include

typedef struct allocation

void *ptr;

size_t size;

const char *file;

int line;

struct allocation *next;

} allocation_t;

static allocation_t *alloc_list = NULL;

static pthread_mutex_t alloc_list_mutex = PTHREAD_MUTEX_INITIALIZER;

// 加入链表

alloc->next = alloc_list;

alloc_list = alloc;

void free_allocation(void* ptr)

if(ptr == NULL) return;

allocation_t **p=&alloc_list;

pthread_mutex_lock(&alloc_list_mutex);

while(*p && (*p)->ptr != ptr) p=&((*p)->next);

if(*p)

{

allocation_t* node=*p;

(*p)=node->next;

free(node);

}

pthread_mutex_unlock(&alloc_list_mutex);

p->file, p->line,p->size);

#define malloc(size) my_malloc(size,__FILE__,__LINE__)

#define free(ptr) free_allocation(ptr)

int main()

atexit(print_allocations);

// 测试代码

char* str = (char*)malloc(100*sizeof(char));

str[0] = ‘a’;

str[1] = ‘b’;

str[2] = ‘c’;

free(str);

return 0;