51Testing软件测试网A(@B-BHcSd4l
五、内存池管理内存机制(单链表管理结构)51Testing软件测试网!d"ZpnNr3K8IM;jsx51Testing软件测试网!dB%e6A.a
这里主要是讨论,从内存块申请开始,就是申请了一个pheap结构指向内存块,然后内存池以什么形式将内存块组织起来,这一个很重要的结构是struct pfree结构。;fuyR]0
|B6V?#Fh z0看一下前面申请内存块之后,这时还只是一个pheap结构,没有和内存池关联起来,在前方我们看到,是通过下面代码进行关联的51Testing软件测试网AepzR~:C51Testing软件测试网C?ZCU1\
51Testing软件测试网+U$p(b5H[JE#O5?jclean = _pool_free(p, _pool_heap_free, (void *)ret);51Testing软件测试网4jW6u.V U@ x|&N
clean->heap = ret; /* for future use in finding used mem for pstrdup */
5`8w-BpY4r0 _pool_cleanup_append(p, clean);
EX8ETY4m0_pool_free为该内存块定义的一个结构进行初始化,如下调用51Testing软件测试网*D4c*oZ'`4t,_+[51Testing软件测试网Di6}(H;C&p;ma~;|\
51Testing软件测试网s8d(Vo/el.w51Testing软件测试网Q/{7@aw
static struct pfree *_pool_free(pool_t p, pool_cleanup_t f, void *arg)51Testing软件测试网u"TU:I#SdHF
{
n`'@'zN'jX0 struct pfree *ret;
G8UTA n$zZ0 while((ret = malloc(sizeof(struct pfree))) == NULL) sleep(1);51Testing软件测试网?zgKf!n:Cz/K
ret->f = f;51Testing软件测试网1SGx[_-\ X~
ret->arg = arg;
0lH)} I.n0j0 ret->next = NULL;/o#X7C:I:k;sm+A0
j-t0b*t{1o0return ret;
mk8^`8L0qQy0}51Testing软件测试网2\gO3cyGTB"~Hb3m
;Sdn!M"z:~+E0这个函数只是定义了一个sturct pfree结构,基本上是用struct pheap这个结构对其进行初始化的,可以看出这个结构的arg和heap域都是指向struct pheap结构。这是很重要的一步,内存池主要是管理这个结构的。51Testing软件测试网
VB(Cb Z(p6F+mb
3cS;lO3Q_'C a*YB0注意这里的pool_cleanup_t是一个函数指针,在我们这里,它是_pool_heap_free。用于指示如何释放这个内存块,实现很简单,如下:&a&f&y7JsB%K3p0
O7vbY2ha0*nf#zo1Apw0static void _pool_heap_free(void *arg)
9~0]g\v4|m0{
yDd3D"h]cr9u9W0 struct pheap *h = (struct pheap *)arg;51Testing软件测试网b3z3|A!eH8UD^;l1x
free(h->block);51Testing软件测试网7P3Ga_V
free(h);
[?,`uOtj0}
)o dVCTct'~0这个释放函数就很简单了吧,下面继续我们话题。%zKB"_n+B0
-f(?^O
L'F6Q2X8@O1K@0前文说了内存池包含链表,管理内存块,那接下来的操作是不是要将这个内存块【struct pfree】加到链表上。看一下_pool_cleanup_append函数做哪些工作:51Testing软件测试网(HyqJc\]r
XV{{;F051Testing软件测试网XtXO}O]6~c3?$E9b h`7a0static void _pool_cleanup_append(pool_t p, struct pfree *pf)51Testing软件测试网%e-i*k)g k6\b
{51Testing软件测试网zi~Ya/_p(m
struct pfree *cur;51Testing软件测试网
pmUb_c
2vGsvhv%KF&sf0if(p->cleanup == NULL)
+{Br-EQ0 {
M3VQ1V,zx'S0 p->cleanup = pf;
n6c7k;xMI;X%mW0 p->cleanup_tail = pf;51Testing软件测试网2YJW8d3mB]
Z_a
return;51Testing软件测试网!I,p$k0WF;X
}OM9s5v&L%vL$b(Y051Testing软件测试网8zW(v,^"|8QvI9d
cur = p->cleanup_tail;51Testing软件测试网,Kgn5}:jh:[*?
cur->next = pf;51Testing软件测试网7{8utj+\
p->cleanup_tail = pf;
(KU]R?0}51Testing软件测试网'Btv9iV
c语言内存池中 二维数组 C语言内存池使用模型-2 - Mr.南柯 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
如果觉得《c语言内存池中 二维数组 C语言内存池使用模型-2 - Mr.南柯 - 51Testing软件测试》对你有帮助,请点赞、收藏,并留下你的观点哦!