c语言内存池中 二维数组,C语言内存池使用模型-2 - Mr.南柯 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值