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 ...
随机推荐
- lvm逻辑卷创建及使用
创建逻辑卷 pvcreate /dev/md0 pvs 查看创建的pv组 pvdisplay /dev/md0 查看磁盘详细信息 添加vg组: 创建vg组: vgcreate vg1 /dev/md0 ...
- python小题目练习(五)
题目:Python实现快速排序 代码实现: """Author:mllContent:Python实现快速排序Date:2020-11-05""&qu ...
- NC212914 牛牛与后缀表达式
NC212914 牛牛与后缀表达式 题目 题目描述 给定牛牛一个后缀表达式 \(s\) ,计算它的结果,例如,1+1对应的后缀表达式为1#1#+,'#'作为操作数的结束符号. 其中,表达式中只含有'+ ...
- NC207040 丢手绢
NC207040 丢手绢 题目 题目描述 "丢丢丢手绢,轻轻地放在小朋友的后面,大家不要告诉她,快点快点抓住她,快点快点抓住她." 牛客幼儿园的小朋友们围成了一个圆圈准备玩丢手绢的 ...
- Web开发小妙招:巧用ThreadLocal规避层层传值
摘要:我们可以在处理每次请求的过程中,无需从Controller以及Service中的方法层层传值,只需要直接通过该局部变量取值即可. 本文分享自华为云社区<拦截器中巧用ThreadLocal规 ...
- 正睿七连测 DAY5 T2
题是水题,也不难想,本来是想打暴力先过个小数据, 本来就想再搞搞优化试试能不能过,毕竟这个题理论上 O( $n^2$ ) 是能过的 题干 主要是觉得这个优化很有可取之处,本来超时,一加这个优化就好很多 ...
- 微信开发在Pc端调用公众号粉丝发送过来的图片素材
因为项目要在PC端搞一个微信墙功能,就是把粉丝发送过来的上墙内容给展示出来,但因为微信对微信素材进行了防盗链加密处理,所以在非微信页面上直接引用在微信服务器上的图片的链接是无法显示的,只会显示一张微信 ...
- YII模块化处理
config.php $config = [ 'modules' => [ 'comment' => [ 'class' => 'frontend\modules\comment\C ...
- 无法访问mybatis.dto.StudengInVO-使用maven编译报错-2022新项目
一.问题由来 最近一次拉代码后,合并代码然后进行编译时出现一个问题,使用maven在进行编译的时候报一个错,无法访问mybatis.dto.StudengInVO. 突然出现这个错误让自己感觉很奇怪, ...
- 5.23 NOI 模拟
$5.23\ NOI $模拟 \(T1\)简单的计算几何题 \(zjr:\)我当时没改,那么自己看题解吧 倒是有个简单的随机化方法(能获得\(72pts,\)正确性未知)\(:\) 随机两条切椭圆的平 ...