#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;
}