内存泄露账本(内存泄漏信息检测与输出并处理)

/*
系统给定mallo free 函数只负责内存分配与释放,并没有记录分配信息.通过自定义实现增加记账的作用,记账信息体是一个结构体。根据账本信息列出内存泄漏的内存的起始地址,占用字节大小,并处理那块内存。
*/

#include <stdio.h>
#include <string.h>
#include  <stdlib.h>
#define  N  100 //账本大小

//定义记账结构体
typedef struct
{
    void * addr;//记录分配起始地址
    int size;//记录分配大小
    int is_free;//0:未释放 1:释放
}memory_blck;

//定义记录全局数组
memory_blck  g_mem_array_blck[N];

//定义数组全局下标值
int  g_index=0;

//定义malloc函数
void*  define_malloc(size_t size)
{
    void* ptr=malloc(size);
    if(ptr!=NULL)
    {
        //记账
        memory_blck  mem_blck;
        mem_blck.addr=ptr;
        mem_blck.size=size;
        mem_blck.is_free=0;

        g_mem_array_blck[g_index++]=mem_blck;
    }
    return ptr;
}

//定义free函数
void define_free(void * addr)
{
    if(addr!=NULL)
    {
        free(addr);
        //修改记录中是否释放状态
        int i;
        for(i=0;i<g_index;i++)
        {
            if(g_mem_array_blck[i].addr==addr)
            {   
                g_mem_array_blck[i].is_free=1;//已经释放
            }
        }
        addr=NULL;
    }
}
int main(int argc, char const *argv[])
{
    int *p1=(int*)define_malloc(10*sizeof(int));
    int *p2=(int*)define_malloc(3*sizeof(int));
    int *p3=(int*)define_malloc(5*sizeof(int));
    int *p4=(int*)define_malloc(6*sizeof(int));
    define_free(p3);

    //输出泄漏地址空间
    int i;
    printf("内存泄露账本:\n");
    for(i=0;i<g_index;i++)
    {
        if(g_mem_array_blck[i].is_free==0)
        {
            printf("没释放的起始地址:%X\t占用字节大小:%d\n",g_mem_array_blck[i].addr,g_mem_array_blck[i].size);
            //后续再释放
            define_free(g_mem_array_blck[i].addr);
        }
    }
    return 0;
}

运行结果:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值