c++内存池设计

c++内存池设计

ID:823245

大小:550.02 KB

页数:20页

时间:2017-09-08

c++内存池设计_第1页
c++内存池设计_第2页
c++内存池设计_第3页
c++内存池设计_第4页
c++内存池设计_第5页
资源描述:

《c++内存池设计》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、C++内存池设计在项目中进程要对变量和对象分配空间,由于频繁的使用new和delete很消耗程序的运行时间,而且容易产生各种内存泄露,内存释放错误等问题。为此,需要设计一个通用的内存池来完成相关的分配和释放的工作。建立内存池:首先向系统申请一块内存,这块内存的大小由使用者根据需要设置初始内存大小。定义一个如下面代码所示的双向链表,将从系统分配的内存分为若干块。使用双向链表方便指针向前和向后遍历查找。链表中*Data指向了系统分配的内存,pUser使用二级指针保存了内存申请者的地址,方便以后系统内存块更改

2、,改变申请者的指向。后面会详细介绍。将双向链表指向指向内存如下所示:假设内存池初始块数为4块,每块的大小为100个字节,则向系统申请400个字节的内存块,每块的大小为100字节。之后使用双向链表DATA指针指向内存块,每个指针能分配的大小如图所示从大到小递减。对象内存分配:对内存的链表指针分配好后,用户可以使用内存池进行内存分配,对于用户的内存分配有两种情况,一种是在现有的内存池中能找到合适的内存块,另一种情况是现有内的内存池没有足够的内存块来分配,需要重新向系统申请内存来满足用户的需求。下面分别就这两

3、种内存分配情况进行说明:情况1内存池有足够的内存块进行分配假设用户申请了240个字节的内存空间,内存池现在有四个内存块空闲,每个内存块的大小为100字节,那么内存池将会给用户取整分配三个内存块。如上图所示,并将指向400内存块的指针的DATE返回给用户使用。情况2内存池没有足够的内存块进行分配接着上图,假设用户现在要接着分别300字节的内存空间,现有内存池的大小已经不能满足,因此需要扩大现有的内存池使用大小。考虑到由于分配给用户的内存空间必须要是连续的内存块,因此这个连续的内存块越大,能分配给用户的内存

4、就多。因此使用C语言的realloc函数来满足要求。函数简介原型:externvoid*realloc(void*mem_address,unsignedintnewsize);语法:指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)。//新的大小一定要大于原来的大小,不然的话会导致数据丢失!头文件:#include有些编译器需要#include,在TC2.0中可以使用alloc.h头文件功能:先判断当前的指针是否有足够的连续空间,如果有,扩

5、大mem_address指向的地址,并且将mem_address返回,如果空间不够,先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域(注意:原来指针是自动释放,不需要使用free),同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。返回值:如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。由realloc函数定义可知,新分配的内存空间可能是在原有的内存基础上扩充,还有可能是在另外的一个地方新开辟一

6、块内存。无论哪种情况多要对新加的内存进行指针指向分配。并且对于第二种情况,会出现的问题是原有的指针全都失效。因为原有指向的内存已经不存在了,因此指向它的指针将失效,原有分配的对象也将失效。为了解决这个问题,在新分配内存后需要重定向原有的指针,并且使用二级指针改变已经分配了对象的地址的指向,使它指向新内存。重定向原有内存的指针的指向,和已经分配了内存的对象的指向。对象释放内存:假如先前的申请了250个字节分配了三个内存块的用户释放了内存,这时链表指针向后查找直到找到第一个被使用的内存块,或链表结尾。之后在

7、先前查找直到找到前面第一个被使用的内存块或者是头指针,之后更新这个区间段内存块的大小。释放内存池:首先释放向系统申请的内存块,之后在清空所有的双向链表。释放向系统申请的内存释放双向链表。后续改进:1,需要对多线程的支持,目前的内存池还只能在单线程的环境下运行。2,如果之前得到内存的对象,在新内存分配前有指针复制操作,原有对象可以通过保存的指针地址进行重定向,但是之前分别的对象不能保证。引进对于分配的对象尽量不要使用指针复制。如果一定需要这么做,那就在每次使用前,在重定向一下。重新进行一次复制操作(保险起

8、见,不知道我的表述是否清楚明白)。源代码: 头文件链表节点的定义#include#include#include#includeusingnamespacestd;namespaceMemePool{typedefunsignedcharEigthByte;//内存池的默认大小和分配节点的默认大小staticconstsize_tDEFAULTMEMEPOOLSIZ

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。