200910code

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


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


 

内容概要:本文详细介绍了“秒杀商城”微服务架构的设计与实战全过程,涵盖系统从需求分析、服务拆分、技术选型到核心功能开发、分布式事务处理、容器化部署及监控链路追踪的完整流程。重点解决了高并发场景下的超卖问题,采用Redis预减库存、消息队列削峰、数据库乐观锁等手段保障数据一致性,并通过Nacos实现服务注册发现与配置管理,利用Seata处理跨服务分布式事务,结合RabbitMQ实现异步下单,提升系统吞吐能力。同时,项目支持Docker Compose快速部署和Kubernetes生产级编排,集成Sleuth+Zipkin链路追踪与Prometheus+Grafana监控体系,构建可观测性强的微服务系统。; 适合人群:具备Java基础和Spring Boot开发经验,熟悉微服务基本概念的中高级研发人员,尤其是希望深入理解高并发系统设计、分布式事务、服务治理等核心技术的开发者;适合工作2-5年、有志于转型微服务或提升架构能力的工程师; 使用场景及目标:①学习如何基于Spring Cloud Alibaba构建完整的微服务项目;②掌握秒杀场景下高并发、超卖控制、异步化、削峰填谷等关键技术方案;③实践分布式事务(Seata)、服务熔断降级、链路追踪、统一配置中心等企业级中间件的应用;④完成从本地开发到容器化部署的全流程落地; 阅读建议:建议按照文档提供的七个阶段循序渐进地动手实践,重点关注秒杀流程设计、服务间通信机制、分布式事务实现和系统性能优化部分,结合代码调试与监控工具深入理解各组件协作原理,真正掌握高并发微服务系统的构建能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值