?? 3.txt
字號:
內(nèi)存池(apr_pool_t)
大多數(shù)libapr的API都依賴于內(nèi)存池,借助內(nèi)存池,簡化了內(nèi)存塊的管理。想像一下沒有內(nèi)存池系統(tǒng)的情況:你申請一些內(nèi)存塊就必需逐個釋放它們,例如如果你申請了10個內(nèi)存塊,你必需釋放10次,否則,你將遭受內(nèi)存泄露的錯誤。內(nèi)存池解決了這個令人感到繁瑣的問題,在申請一個內(nèi)存池之后,你可以從內(nèi)存池中申請多個內(nèi)存塊,釋放它們的時候,你所需要做的就是銷毀內(nèi)存池,這樣你就可以釋放所有的內(nèi)存塊了。這有兩個優(yōu)點,第一,它可以預(yù)防內(nèi)存泄露的錯誤;第二,分配內(nèi)存塊的開銷相對變低了。從某種意義上說,內(nèi)存池迫使你遵循面向會話編程,一個內(nèi)存池就是一種會話內(nèi)容,這樣,處于同一個內(nèi)存池中的對象就有相同的生命周期,你可以通過控制會話內(nèi)容來控制對象。在一個會話的開始,你創(chuàng)建了一個內(nèi)存池,接著,你在內(nèi)存池中創(chuàng)建了一些對象,你不需要去關(guān)心這些對象的生命周期,最后,在會話結(jié)束的時候,你只需要將那個內(nèi)存池銷毀就可以了。
注:通常,對象生命周期控制是程序開發(fā)最困難的部分,因此,針對這個問題還存在有一些技術(shù),例如smart pointer,垃圾回收等等。需要注意,同時使用這些技術(shù)有一定的難度,自從內(nèi)存池成為這其中的一項技術(shù)以后,你不得不非常小心的使用它們。
注:在將來,libapr的內(nèi)存池將變得不再那么重要。參見http://mail-archives.apache.org/mod_mbox/apr-dev/200502.mbox/%3c1f1d9820502241330123f955f@mail.gmail.com%3e.
下面有三個基本的API函數(shù):
/* 摘自 apr_pools.h */
APR_DECLARE(apr_status_t) apr_pool_create(apr_pool_t **newpool,
apr_pool_t *parent);
APR_DECLARE(void *) apr_palloc(apr_pool_t *p, apr_size_t size);
APR_DECLARE(void) apr_pool_destroy(apr_pool_t *p);
我們使用apr_pool_create()函數(shù)創(chuàng)建一個內(nèi)存池,這個內(nèi)存池將一直存活,直到你調(diào)用apr_pool_destroy()函數(shù)以后被銷毀。apr_pool_create()的第一個參數(shù)是一個結(jié)果輸出參數(shù),是一個新創(chuàng)建的apr_pool_t類型的內(nèi)存池對象。通過調(diào)用apr_palloc()來申請指定大小的內(nèi)存塊,具體使用方法見mp-sample.c。
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -