C/C++内存泄漏检测方法
1. 内存泄漏
内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
2. 检测代码
使用链表记录每个malloc返回的指针,释放时从链表中查找并删除找到对应指针的节点。
最终输出链表,该链表记录了所有没有释放的动态内存。
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/types.h>
#include <malloc.h>
#include <string.h>
#include <stdlib.h> #define output_file "leak_detector_report.txt" typedef struct {
void* addr; //the memory address
unsigned char file[128]; //the file of the memory alloc statement
unsigned int line; //the line of the memory alloc statment
unsigned int size; //the size of the memory alloced
}addr_info; typedef struct addr_info_node{
addr_info info;
struct addr_info_node *next;
}addr_info_node, *addr_info_list; pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER;
addr_info_list g_head = NULL; void *malloc_detector(int size, unsigned char *file, unsigned int line)
{
void *ptr = malloc(size);
if (NULL == ptr)
{
return NULL;
} addr_info_node *node = (addr_info_node*)malloc(sizeof(addr_info_node));
if (NULL == node)
{
return NULL;
}
memset(node, 0, sizeof(addr_info_node));
node->info.addr = ptr;
node->info.line = line;
node->info.size = size;
strncpy(node->info.file,file,127);
node->next = NULL;
pthread_mutex_lock(&g_mutex);
if (NULL == g_head)
{
g_head = (addr_info_node*)malloc(sizeof(addr_info_node));
if (NULL == g_head)
{
free(node);
return NULL;
}
memset(g_head, 0, sizeof(addr_info_node));
}
addr_info_node *tail = g_head;
while (NULL != tail->next)
{
tail = tail->next;
}
tail->next = node;
pthread_mutex_unlock(&g_mutex);
return ptr;
} void free_detector(void *addr)
{
//Find and Delete the info which has the address==addr from Alloc_Info_List head
/*we only detecte the memory-leak, not the wrong free-addr which not in the addr_info_list*/
pthread_mutex_lock(&g_mutex);
addr_info_node *node = g_head;
while (NULL != node->next)
{
if (node->next->info.addr == addr)
{
free(addr);
node->next = node->next->next;
break;
}
printf("2 file %s line %d,addr %p,size %d\n",
node->info.file,node->info.line,node->info.addr,node->info.size);
node = node->next;
}
pthread_mutex_unlock(&g_mutex);
} void report_info()
{
FILE *fp_write=fopen(output_file,"w+");
if(!fp_write)
{
printf("can't open file\n");
return;
}
char info[sizeof(addr_info)+128];
pthread_mutex_lock(&g_mutex);
addr_info_node *node = g_head->next;
while (NULL != node)
{
sprintf(info,"memory leak:file %s line %d,addr %p,size %d\n",
node->info.file,node->info.line,node->info.addr,node->info.size);
fwrite(info,strlen(info)+1,1,fp_write);
node = node->next;
}
fclose(fp_write);
pthread_mutex_unlock(&g_mutex);
} void thread1_malloc_free()
{
void *ptr = malloc_detector(100, __FILE__, __LINE__);
ptr = malloc_detector(200, __FILE__, __LINE__);
free_detector(ptr);
ptr = malloc_detector(200, __FILE__, __LINE__);
} void thread2_malloc_free()
{
void *ptr = malloc_detector(400, __FILE__, __LINE__);
ptr = malloc_detector(800, __FILE__, __LINE__);
free_detector(ptr);
ptr = malloc_detector(1600, __FILE__, __LINE__);
} int main()
{
pthread_t thread1, thread2;
pthread_create(&thread1, NULL, (void *)&thread1_malloc_free, NULL);
pthread_create(&thread2, NULL, (void *)&thread2_malloc_free, NULL);
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
report_info();
}
运行输出
memory leak:file memory_detector.c line 115,addr 0x7f88c0000b60,size 100
memory leak:file memory_detector.c line 123,addr 0x7f88b8000b60,size 400
memory leak:file memory_detector.c line 118,addr 0x7f88c0001120,size 200
memory leak:file memory_detector.c line 126,addr 0x7f88b8001170,size 1600
C/C++内存泄漏检测方法的更多相关文章
- VS2005内存泄漏检测方法[转载]
一.非MFC程序可以用以下方法检测内存泄露: 1. 程序开始包含如下定义: #ifdef _DEBUG #define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __ ...
- C++程序内存泄漏检测方法
一.前言 在Linux平台上有valgrind可以非常方便的帮助我们定位内存泄漏,因为Linux在开发领域的使用场景大多是跑服务器,再加上它的开源属性,相对而言,处理问题容易形成“统一”的标准.而在W ...
- 【转】简单内存泄漏检测方法 解决 Detected memory leaks! 问题
我的环境是: XP SP2 . VS2003 最近在一个项目中,程序退出后都出现内存泄漏: Detected memory leaks! Dumping objects -> {98500} n ...
- _CrtSetBreakAlloc简单内存泄漏检测方法,解决Detected memory leaks!问题
我的环境是: XP SP2 . VS2003 最近在一个项目中,程序退出后都出现内存泄漏: Detected memory leaks! Dumping objects -> {98500} n ...
- [教程] Android Native内存泄漏检测方法
转载请注明出处:https://www.cnblogs.com/zzcperf/p/9563389.html Android 检测 C/C++内存泄漏的方法越来越简便了,下面列举一下不同场景下检测C/ ...
- Windows 下的内存泄漏检测方法
在 Windows 下,可使用 Visual C++ 的 C Runtime Library(CRT) 检测内存泄漏. 首先,我们在.c或.cpp 文件首行插入这一段代码: #define _CRTD ...
- 【Visual Studio】简单内存泄漏检测方法 解决 Detected memory leaks! 问题(转)
原文转自 http://blog.csdn.net/u011430225/article/details/47840647 我的环境是: XP SP2.VS2003 最近在一个项目中, 程序退出后都出 ...
- C++ 简单内存泄漏检测方法
遇到个bug,MFC程序异常退出,debug模式下输出 Detected memory leaks! Dumping objects -> {366566} normal block at 0x ...
- visual leak dector内存泄漏检测方法
http://vld.codeplex.com/ QT 内存泄露时,你们一般用什么工具检测啊 ------解决方案--------------------这篇你觉得详细么 :http://newfac ...
随机推荐
- VisionPro · C# · 图像显示十字光标
程序通过 CogRecordDisplay 显示控件显示视觉运行结果图像,当我们对调试时,可能需要用到图像中心十字对位光标. 本文通过VisionPro两个拟合线工具,一个拟合圆工具在图像中画出光标, ...
- python小题目练习(七)
题目:实现如下图所示结果 代码实现: """Author:mllContent:模拟火车订票系统Date:2020-11-16"""# 定义 ...
- python是什么?工作前景如何?怎么算有基础?爬数据违法嘛......
随着python越来越火爆并在2021年10月,语言流行指数的编译器Tiobe将Python加冕为最受欢迎的编程语言,且置于Java.C和JavaScript之上,于是越来越多的人开始了解python ...
- 毕设必看——Python ttkbootstrap 制作账户注册信息界面
先来哔哔两句:(https://jq.qq.com/?_wv=1027&k=QgGWqAVF) ttkbootstrap 是一个基于 tkinter 的界面美化库,使用这个工具可以开发出类似前 ...
- Python教程:随机验证码生成和join 字符串
函数:string.join() Python中有join()和os.path.join()两个函数,具体作用如下: join(): 连接字符串数组.将字符串.元组.列表中的元素以指定的字符(分隔符) ...
- docker实时查看日志
docker logs -f --tail=10 fo-order -f : 查看实时日志 --tail=10 : 查看最后的10条日志. fo-order: 容器名称
- 什么?让每一个开源项目更安全?啊?还有IDE工具?难道是它?
背景 入编程界6年来,大大小小的安全漏洞是真滴听了不少,xxx通过日志入侵了,xxxx通过请求入侵了,等等等等. 近期fastJson又报安全漏洞,敢巧自己又"被"跳槽到了新公司, ...
- JavaWEB-01-MySQL基础
JavaWeb内容 数据库 – 数据存储 MySQL JDBC Maven - 项目管理工具 Mybatis 前端 - 为了前端哥们沟通 HTML+CSS JavaScript Ajax + Vue ...
- 跟HR在大群吵架是什么体验?
原创不易,求分享.求一键三连 昨天跟HR负责人在公司大群吵了一架,先说结论:我输了... 事情原委是,老板在周一司庆上聊嗨了,说了一句:我觉得打卡没用,建议取消打卡. 下来后老板在公司论坛发了一个问题 ...
- APISpace 让你快速获取安徒生童话故事
<安徒生童话>是丹麦作家安徒生创作的童话集,共由166篇故事组成.该作爱憎分明,热情歌颂劳动人民.赞美他们的善良和纯洁的优秀品德:无情地揭露和批判王公贵族们的愚蠢.无能.贪婪和残暴. 接口 ...