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中内存泄漏的检测(五):记录内存泄漏的代码缩略图 Linux中内存泄漏的检测(五):记录内存泄漏的代码](https://www.72715.net/wp-content/uploads/2023/05/d2c88270a5f586e8b1428912100f7317.png)
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;