200910code

本文详细介绍了如何使用动态单链表实现内存分配、释放和内存泄漏检测,包括内存分配函数、内存释放函数和内存泄漏检查函数。通过实例演示了如何在应用程序中管理内存,避免内存泄漏。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


#include "OJ.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#define PID_TEST_MLC 100
#define DYNAMIC_MEM_PT 1


/*****************************************************************************
题目描述:

      不考虑多线程,使用动态单链表的方式进行操作:在应用程序申请内存时,需
  要把该内存节点的信息插入链表进行记录;在应用程序释放内存时,把相应内存节
  点的信息从链表中删除;在应用程序退出时,如果链表中仍然存在节点,说明应用
  程序存在内存泄漏。应用程序不存在内存泄漏,则链表应该为空。
*****************************************************************************/

struct Memery_Node {
 char *pcFileName;
 unsigned int ulSize;
 unsigned int ulLine;
 void *memAddr;
};
struct Memry_List {
 struct Memery_Node *Mem_Node;
 struct Memry_List *Next;
};

struct Memry_List gHead_Node = {NULL,NULL};

/******************************************************************************
  Function    : MLC_MemAlloc
  Description : 内存分配函数
  Calls       :
  Called By   :
  Input       :
 
  ulPidSid    申请内存的模块ID ,MLC程序进行内存申请时,请统一使用PID_TEST_MLC
  ucPtNo      已经创建了的内存分区号, MLC程序进行内存申请时,请统一使用DYNAMIC_MEM_PT
  ulSize      要申请的内存的大小

  Output      :
  Return      :
  Author      :
*****************************************************************************/

void *MLC_MemAlloc(unsigned int ulPidSid, unsigned char ucPtNo, unsigned int ulSize,  char *pcFileName, unsigned int ulLine)
{
 struct Memery_Node *Mem_Node = NULL;
 struct Memry_List *List_Node = NULL;
 struct Memry_List *Curr_Node = NULL;
 struct Memry_List *Pre_node = NULL;
 void *pAddr = NULL;

    /*在这里完成功能*/
    if (ulPidSid != PID_TEST_MLC || ucPtNo != DYNAMIC_MEM_PT || NULL == pcFileName || 0 == ulLine)
     return NULL;

 Mem_Node = (struct Memery_Node *)malloc(sizeof(struct Memery_Node));
 if (NULL == Mem_Node)
  return NULL;
 memset(Mem_Node, 0, sizeof(struct Memery_Node));

 pAddr = (void *)malloc(ulSize*sizeof(char));
 if (NULL == pAddr) {
  free(Mem_Node);
  Mem_Node = NULL;
  return NULL;
 }
 memset(pAddr, 0, ulSize);

 Curr_Node = (struct Memry_List *)malloc(sizeof(struct Memry_List));
 if (NULL == Curr_Node) {
  free(pAddr);
  pAddr = NULL;
  free(Mem_Node);
  Mem_Node = NULL;
  return NULL;
 }
 memset(Curr_Node, 0, sizeof(struct Memry_List));

 Mem_Node->ulSize = ulSize;
 Mem_Node->pcFileName = pcFileName;
 Mem_Node->ulLine = ulLine;
 Mem_Node->memAddr = pAddr;

 Curr_Node->Mem_Node = Mem_Node;
 Curr_Node->Next = NULL;

 List_Node = &gHead_Node;
 while(NULL != List_Node) {
  Pre_node = List_Node;
  List_Node = List_Node->Next;
 }

 Pre_node->Next = Curr_Node;
 return pAddr;

}

/*****************************************************************************
  Function    : MLC_MemFree
  Description : 内存释放函数
  Calls       :
  Called By   :
  Input       :
  Output      :
  Return      :
  Author      :
*****************************************************************************/
void MLC_MemFree(unsigned int ulPidSid,  void *pAddr)
{
    /*在这里完成功能*/
 struct Memery_Node *Mem_Node = NULL;
 struct Memry_List *List_Node = NULL;
 struct Memry_List *Curr_Node = NULL;
 struct Memry_List *Pre_node = NULL;

 if (NULL == pAddr || (NULL == (gHead_Node.Next)->Mem_Node) || gHead_Node.Next == NULL)
  return;

 Curr_Node = &gHead_Node;
 while(NULL != Curr_Node)
 {
  Pre_node = Curr_Node;
  Curr_Node = Curr_Node->Next;
        if (NULL == Curr_Node) {
   return;
  }
  Mem_Node = Curr_Node->Mem_Node;
  if (Mem_Node->memAddr == pAddr)
   break;
 }
 Pre_node->Next = Curr_Node->Next;

 free(Curr_Node->Mem_Node);
 Curr_Node->Mem_Node = NULL;
 free(Mem_Node->memAddr);
 Mem_Node->memAddr = NULL;
 free(Curr_Node);
 Curr_Node = NULL;
 return;
}

/*****************************************************************************
  Function    : MLC_CheckIfMemLeak
  Description : 内存泄漏检查函数,发现内存泄漏,按照规定的格式打印泄漏的内存信息;
                没有泄漏,打印没有泄漏的提示信息
  Calls       :
  Called By   :
  Input       :
  Output      :ulAddrNum  泄漏的内存块个数
               pAddrArray 存储泄漏的内存块地址的数组
  Return      :没有泄漏返回 0/存在泄漏 返回 -1
  Author      :
*****************************************************************************/
unsigned int MLC_CheckIfMemLeak (unsigned int *pulAddrNum, void* pAddrArray[])
{
    /*在这里完成功能*/
    struct Memery_Node *Mem_Node = NULL;
 struct Memry_List *List_Node = NULL;
 struct Memry_List *Curr_Node = NULL;
 struct Memry_List *Pre_node = NULL;
 unsigned int ulAddrNum  = 0;

    if (NULL == pulAddrNum || NULL == pAddrArray || NULL == gHead_Node.Next)
     return -1;

 Curr_Node = gHead_Node.Next;
 while (NULL != Curr_Node) {
  pAddrArray[ulAddrNum++] = Curr_Node->Mem_Node->memAddr;
  Curr_Node = Curr_Node->Next;
 }

 if (ulAddrNum > 0 )
  return -1;

 return 0;
}

/*****************************************************************************
  Function    : MLC_CollectMemory
  Description : 自动回收泄漏的内存
  Calls       :
  Called By   :
  Input       :
  Output      :
  Return      :
  Author      :
*****************************************************************************/
void MLC_CollectMemory(void)
{
    /*在这里完成功能*/
 struct Memery_Node *Mem_Node = NULL;
 struct Memry_List *List_Node = NULL;
 struct Memry_List *Curr_Node = NULL;
 struct Memry_List *Pre_node = NULL;
 if ( NULL== gHead_Node.Next || NULL == (gHead_Node.Next)->Mem_Node)
  return;

 Curr_Node = gHead_Node.Next;
 while(NULL != Curr_Node) {
  memcpy(Pre_node, Curr_Node,sizeof(struct Memry_List));
  free(Curr_Node->Mem_Node->memAddr);
  Curr_Node->Mem_Node->memAddr = NULL;
  free(Curr_Node->Mem_Node);
  Curr_Node->Mem_Node = NULL;
  free(Curr_Node);
  Curr_Node = Pre_node->Next;
 }
 gHead_Node.Next = NULL;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值