由于嵌入式平台需求,自己写了个内存管理程序,可以动态分配和回收内存,求各位看官对该算法的评价。

C/C++ code
#include "stdio.h"unsigned intfree_tmp[1024*1024*2/4]={0}; //申请空间头结构structnew_head{ unsigned intnew_size; //申请空间块总大小unsigned intmagic; //合法性校验,值为(~new_size)}; //空闲空间头结构structfree_head{ unsigned intfree_size; //空闲块总大小structfree_head *next; //下一个空闲块指针unsigned intmagic; //合法性校验,值为 (next+~free_size)}; structfree_head *global_first_pFreeHead; //全局 地址最低的空闲块 //初始化动态内存块intfree_init(void*start_add,unsigned intsize) { global_first_pFreeHead =(structfree_head *)start_add; global_first_pFreeHead->next=NULL; global_first_pFreeHead->free_size=size; global_first_pFreeHead->magic=(unsigned int)global_first_pFreeHead->next+~global_first_pFreeHead->free_size; return0; } //申请内存void*new_n(unsigned intnew_size) { structfree_head *p_free=NULL; //链表遍历指针structfree_head *tmp=NULL; //暂存指针structnew_head *new_tmp; //申请内存头指针new_size=(((new_size-1)>>2)<<2)+4; //使申请字节数为4的倍数for(p_free=global_first_pFreeHead;p_free!=NULL;p_free=p_free->next) //查找空闲块链表中符合要求的最小块{ ///for debugif(p_free->magic!=(unsigned int)p_free->next+~p_free->free_size) //检查空闲内存头合法性{ printf("堆栈检查错误!堆栈被破坏!/r/n"); returnNULL; } if(p_free->free_size>=(new_size+sizeof(structnew_head))) { if(tmp==NULL ||tmp->free_size>p_free->free_size) { tmp =p_free; } } } if(tmp!=NULL) //从该空闲块中剥离申请空间{ structfree_head *store_tmp; p_free=tmp; store_tmp=p_free; p_free=(structfree_head *)(((char*)p_free)+new_size+sizeof(structnew_head)); p_free->free_size=store_tmp->free_size-(new_size+sizeof(structnew_head)); p_free->next=store_tmp->next; p_free->magic=(unsigned int)p_free->next+~p_free->free_size; if(store_tmp==global_first_pFreeHead) { global_first_pFreeHead=p_free; } } elsereturnNULL; //将剥离的空间初始化,并返回可用空间指针new_tmp=(structnew_head *)tmp; new_tmp->new_size=new_size+sizeof(structnew_head); new_tmp->magic=~(new_tmp->new_size); return((char*)new_tmp)+sizeof(structnew_head); } //释放空间voidfree_n(void*p) { structnew_head *p_tmp; // structfree_head *p_new; // structfree_head *p_free; //链表遍历指针unsigned intbytes_num; //记录释放空间大小p_tmp=(structnew_head *)((char*)p -sizeof(structnew_head)); //指向申请内存头if(p_tmp->new_size!=~p_tmp->magic) //检查内存头合法性{ printf("wrong pointer to be free is detected! free failed!"); return; } bytes_num=p_tmp->new_size;//记录释放空间大小p_new=(structfree_head *)p_tmp; //将该内存块变为空闲块p_new->free_size=bytes_num; for(p_free=global_first_pFreeHead;;) //将释放区域插入链表中{ ///for debugif(p_free->magic!=(unsigned int)p_free->next+~p_free->free_size) //检查空闲内存头合法性{ printf("堆栈检查错误!堆栈被破坏!/r/n"); return; } if(p_free==global_first_pFreeHead &&p_free>p_new) //插入链表首位置{ global_first_pFreeHead=p_new; p_new->next=p_free; break; } if(p_free <p_new &&p_free->next >p_new) //插入链表中间位置{ p_new->next=p_free->next; p_free->next=p_new; p_free->magic=(unsigned int)p_free->next+~p_free->free_size; break; } if(p_free->next==NULL) //插入链表末尾{ p_free->next=p_new; p_free->magic=(unsigned int)p_free->next+~p_free->free_size; p_new->next=NULL; break; } else{ p_free=p_free->next; } } p_new->magic=(unsigned int)p_new->next+~p_new->free_size; for(p_free=global_first_pFreeHead;p_free!=NULL;p_free=p_free->next) //组合连续链表{ intflag1,flag2=NULL; do{ flag1=NULL; if(p_free ==(structfree_head *)((char*)p_free->next -p_free->free_size)) //判断连续性{ p_free->free_size =p_free->free_size +p_free->next->free_size;//必须先设置大小,然后再设置链表指针p_free->next =p_free->next->next; flag1=!NULL; flag2=!NULL; } }while(flag1); if(flag2) p_free->magic=(unsigned int)p_free->next+~p_free->free_size; } } int_tmain(intargc, _TCHAR*argv[]) { unsigned inti=0; printf("%d %u",sizeof(int),i-1); free_init(free_tmp,1024*1024*2); int*p0=(int*)new_n(sizeof(int)); *p0=0x12345678; //free_n(p0);int*p1=(int*)new_n(sizeof(int)); *p1=0x77777777; //free_n(p0);int*p2=(int*)new_n(sizeof(int)*1); p2[0]=0x12341234; //p2[1]=0x66668888;int*p3=(int*)new_n(sizeof(int)*1); p3[0]=0x11111111; //p3[1]=0x22222222; //p3[2]=0x33333333;free_n(p0); free_n(p2); free_n(p3); free_n(p1); return0; }

迷你 动态内存管理代码 适于嵌入式系统相关推荐

  1. RT-Thread 动态内存管理(学习笔记)

    本文参考自[野火EmbedFire]<RT-Thread内核实现与应用开发实战--基于STM32>,仅作为个人学习笔记.更详细的内容和步骤请查看原文(可到野火资料下载中心下载) 文章目录 ...

  2. C和C++安全编码笔记:动态内存管理

    4.1 C内存管理: C标准内存管理函数: (1).malloc(size_t size):分配size个字节,并返回一个指向分配的内存的指针.分配的内存未被初始化为一个已知值. (2).aligne ...

  3. LwIP 之五 详解动态内存管理 内存堆(mem.c/h)

    写在前面   目前网上有很多介绍LwIP内存的文章,但是绝大多数都不够详细,甚至很多介绍都是错误的!无论是代码的说明还是给出的图例,都欠佳!下面就从源代码,到图例详细进行说明.   目前,网络上多数文 ...

  4. 内存区划分;内存分配;堆、栈概念分析;动态内存管理数据结构及程序样例;核心态与用户态...

    一. 在c中分为这几个存储区1.栈 - 由编译器自动分配释放 2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初 ...

  5. LwIP 之六 详解内存池(memp.c/h)动态内存管理策略

      对于嵌入式开发来说,内存管理及使用是至关重要的,内存的使用多少.内存泄漏等时刻需要注意!合理的内存管理策略将从根本上决定内存分配和回收效率,最终决定系统的整体性能.LwIP 就提供了 动态内存堆管 ...

  6. 《C++应用程序性能优化::第五章动态内存管理》学习和理解

    <C++应用程序性能优化::第五章动态内存管理>学习和理解 说明:<C++应用程序性能优化> 作者:冯宏华等 2007年版. 2010.8.29 cs_wuyg@126.com ...

  7. C语言之动态内存管理与动态内存函数

    文章目录 一.为什么存在动态内存分配? 二.动态内存函数的介绍 1.malloc和free 2.calloc函数 3.realloc函数 一.为什么存在动态内存分配? 学习动态内存的管理方法之前,我们 ...

  8. C++ 动态内存管理:c/c++的动态内存管理,new/delete,operator new/delete,placement-new, 内存泄漏

    c/c++的动态内存管理 new/delete opeartor new/delete placement-new 内存泄漏 c/c++的动态内存管理 在开始之前首先要了解c和c++的内存分布,我简单 ...

  9. 动态内存管理:malloc和free以及new和delete的联系与区别

    动态内存管理:malloc和free以及new和delete的联系与区别 文章目录 动态内存管理:malloc和free以及new和delete的联系与区别 一. C/C++中程序内存区域划分: 二. ...

最新文章

  1. 8. 修改matlab GUI中fig和m文件名修改流程及注意事项
  2. mysql 5.7 存储引擎_mysql5.7——innodb存储引擎总结
  3. 每日一皮:开会不关微信的尴尬(2)
  4. vsftpd服务的搭建
  5. 实践 Neutron 前的两个准备工作 - 每天5分钟玩转 OpenStack(78)
  6. 95-30-050-java.util.ArrayList:Vector
  7. solidity语言介绍以及开发环境准备
  8. android自定义加载旋转框
  9. 显示风场的某一局部区域,实现多分辨率
  10. 【着色器实现Shine局部或整体扫光效果_Shader效果第三篇】
  11. 笔记本取消fn +功能键
  12. 原生js + canvas 实现刻度尺效果
  13. OpenGL中矩阵的存储方式
  14. 雇佣兵 2021.02.25
  15. 高分屏win10PS/AI等软件界面字太小解决方法
  16. java blueprint_OSGI Blueprint入门之四
  17. Ubuntu安装Matlab其Simulink没有菜单栏的解决方案
  18. Android 自定义 ListView 上下拉动“刷新最新”和“加载更多”歌曲列表
  19. SQ01报表添加事物码
  20. 微信公众号支付: JSAPI缺少参数:total_fee ;没有生成预支付ID package=prepay_id=null;

热门文章

  1. html场景动画,HTML5 CSS3场景动画:热情的沙漠
  2. 金蝶系统服务器链接设置,金蝶更改服务器连接设置
  3. NOI-1.3(18) 等差数列末项计算
  4. Windows环境下搭建nginx文件下载服务器
  5. 面向对象及面向对象编程思想
  6. Word——转载-LaTeX如何在Word中使用(一)
  7. 计算机的研究生学校有哪些专业好就业前景,2021考研
  8. 酒店有担保、预付和现付的付款方式
  9. 免费润色文章的软件-自动修改文章润色的软件
  10. “程序设计与算法训练”课程设计“二值图像数字水印技术的实践”