/*
* malloc_dummy.c
*
* Created on: 2011/04/27
* Author: p000457712
*/
#include <stdlib.h>
#include <stdio.h>
#include <memory.h>
#include <string.h>
#if 1
static int count=0;
static int remain_count=0;
typedef struct m{
void * ptr;
int id;
size_t size;
char *file;
int line;
} M;
#define MAX_MALLOC_COUNT (200000)
static M mem[MAX_MALLOC_COUNT];
static int is_inited= 0;
//extern void *__libc_malloc(size_t size);
//extern void __libc_free(void* ptr);
void ptr_guard(){}
static int guarded_count_list[]={
MAX_MALLOC_COUNT,
-1,
};
int is_guarded(count){
int i=0;
for(;guarded_count_list[i] != -1;i++){
if(guarded_count_list[i]==count){
return 1;
}
}
return 0;
}
void* D_malloc(size_t size, char *file, int line)
{
if(!is_inited){
memset(mem,0,MAX_MALLOC_COUNT);
is_inited = 1;
}
void* p = malloc(size);
M * mmm = &(mem[count]);
mmm->ptr = p;
mmm->id = count;
mmm->size = size;
if(file == NULL) {
mmm->file = "no";
}
else{
mmm->file = file;
}
mmm->line = line;
if(is_guarded(count)){
ptr_guard();
}
count++;
remain_count++;
return p;
}
M* find_ptr(void* ptr){
int i = 0;
for(;i< MAX_MALLOC_COUNT;i++){
if(mem[i].ptr == ptr){
return &(mem[i]);
}
}
return NULL;
}
void dump_ptrs(){
int i = 0;
int sum = 0;
printf("~~~~~~~~~~~~all operation[count:%d][remain:%d]~~~~~~~~~\n",count,remain_count);
for(;i< MAX_MALLOC_COUNT;i++){
if(mem[i].ptr == NULL){
continue;
}
else if((mem[i].line<=0) || (mem[i].file==NULL)){
printf("untracked source->size:%d\n",mem[i].size);
}
else{
fprintf(stderr,"remain ptr id %d ptr %x size %d, file:%s ->line:%d\n",
i, (int)mem[i].ptr, mem[i].size, mem[i].file, mem[i].line);
/*fprintf(stderr,"remain ptr id %d ptr %x size %d\n",
i, (int)mem[i].ptr, mem[i].size);*/
// fprintf(stderr,"%d,\n",i);
sum += mem[i].size;
}
}
fprintf(stderr, "===========================\n");
fprintf(stderr, "summary: %d\n", sum);
return ;
}
#define REMAIN_THRSH 0
void *D_realloc(void *ptr, size_t size, char *file, int line)
{
if(ptr!=NULL){
remain_count--;
}
M* m_ptr = find_ptr(ptr);
if(m_ptr != NULL){
if(remain_count < REMAIN_THRSH){
fprintf(stderr,"free ptr id %d ptr %x size %d remaining %d\n",m_ptr->id,(int)m_ptr->ptr,m_ptr->size,remain_count);
}
m_ptr->ptr = NULL;
}
else{
fprintf(stderr,"UNEXPECTED D_realloc!!\n");
}
void* p = realloc(ptr, size);
M * mmm = &(mem[count]);
mmm->ptr = p;
mmm->id = count;
mmm->size = size;
if(file == NULL) {
mmm->file = "no";
}
else{
mmm->file = file;
}
mmm->line = line;
if(is_guarded(count)){
ptr_guard();
}
count++;
remain_count++;
return p;
}
void D_free(void* ptr){
if(ptr!=NULL){
remain_count--;
}
M* m_ptr = find_ptr(ptr);
if(m_ptr != NULL){
if(remain_count < REMAIN_THRSH){
fprintf(stderr,"free ptr id %d ptr %x size %d remaining %d\n",m_ptr->id,(int)m_ptr->ptr,m_ptr->size,remain_count);
}
m_ptr->ptr = NULL;
m_ptr->file = NULL;
}else{
fprintf(stderr,"UNEXPECTED FREE!!\n");
}
if(remain_count == REMAIN_THRSH){
dump_ptrs();
}
free(ptr);
}
#else
void* D_malloc(size_t size){
void* p = malloc(size);
return p;
}
void *D_realloc(void *ptr, size_t size)
{
void* p = realloc(ptr, size);
return p;
}
void D_free(void* ptr){
free(ptr);
}
#endif
C 语言检测内存泄露的方法(例子)
3星 · 超过75%的资源 需积分: 50 12 浏览量
2013-05-11
19:50:44
上传
评论
收藏 19KB RAR 举报
sh_sj_wuneng
- 粉丝: 3
- 资源: 61
最新资源
- stm32 usb接口通信
- Chessmate是一款完全免费的国际象棋学习软件,支持引擎分析,学开局、残局、棋书解读、大数据分析等功能
- 总结整理的Android面试Java基础知识点面试资料精编汇总文档资料合集.zip
- .android_lq
- FDN5632N-VB一款SOT23封装N-Channel场效应MOS管
- 毛老板-2404250902.amr
- Java类加载流程(双亲委派)流程图.zip
- FDN5632-NL-VB一款SOT23封装N-Channel场效应MOS管
- 新目标大学英语(第二版)视听说教程 第1册 Unit 4 TOP课件.zip
- 自动驾驶-状态估计和定位之Error State EKF.pdf
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈