抑郁症健康,内容丰富有趣,生活中的好帮手!
抑郁症健康 > c语言内存池中 二维数组 C语言内存池使用模型-2 - Mr.南柯 - 51Testing软件测试

c语言内存池中 二维数组 C语言内存池使用模型-2 - Mr.南柯 - 51Testing软件测试

时间:2021-04-17 20:16:21

相关推荐

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软件测试》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。