Talloc記憶體池使用教程 4 使用析構函式

2021-07-25 00:08:57 字數 971 閱讀 6042

析構函式是物件導向程式設計的世界中廣為人知的方法。乙個析構函式是乙個物件在銷毀時自動執行的方法。它通常用來釋放物件從系統中申請的資源(比如:關閉檔案描述符,斷開資料庫連線,釋放記憶體)。

使用talloc,即便我們在c語言中也能夠受益於析構函式的好處。我們可以很容易的為乙個talloc context附加上我們自己的析構函式。當context被釋放時,析構函式將會自動執行。

使用talloc_set_destructor()來為talloc context附加或刪除析構函式。

想象我們有乙個動態建立的鍊錶。當我們釋放其中的乙個元素前,我們需要先確認它已經從鍊錶中被移除了。一般來說,這需要兩個先後完成的動作:將其從鍊錶中移除,然後釋放記憶體。使用talloc,我們可以通過設定元素的析構函式一次完成這件事,析構函式中將元素從鍊錶中移除,talloc_free()將會完成餘下的工作。

析構函式將類似這樣:

int list_remove(void *ctx)

gcc3及更新版本可以在編譯時檢查型別。因此如果我們使用這樣的編譯器,我們可以使用更高階的析構函式:

int list_remove(struct list_el *el)

現在我們將向元素設定析構函式。我們可以直接在插入函式中完成這件事情:

struct list_el* list_insert(talloc_ctx *mem_ctx,

struct list_el *where,

void *ptr)

由於talloc是乙個有層級的記憶體分配器,我們可以進一步釋放記憶體:

struct list_el* list_insert_free(talloc_ctx *mem_ctx,

struct list_el *where,

void *ptr)

boost pool記憶體池使用

1 boost pool只能作為普通資料型別的記憶體池,如int double等,因為他只分配記憶體,不呼叫建構函式。2 如果記憶體分配失敗,不拋異常,我們應該判斷返回的指標是不是nullptr,防止空指標錯誤。3 我們一般不應該手工呼叫free 等釋放記憶體的函式,應該交給記憶體池自動進行管理。如...

C 使用記憶體池,Stream池防止記憶體碎片化

為什麼要引入記憶體池?引入記憶體池的好處是什麼?引入記憶體池能解決哪些問題?什麼情況下使用記憶體池效果更加明顯?相信大家都懂,那我們就不說了,直接來看看怎麼使用吧。我想了想,覺得還是要先解答一下上面的問題,不然我有些過意不去 qiang po zheng 為什麼引入記憶體池,好處是什麼?能夠重複利用...

boost庫記憶體池使用

記憶體池 memory pool 是一種記憶體分配方式。通常我們習慣直接使用new malloc等api申請分配記憶體,這樣做的缺點在於 由於所申請記憶體塊的大小不定,當頻繁使用時會造成大量的記憶體碎片並進而降低效能。記憶體池則是在真正使用記憶體之前,先申請分配一定數量的 大小相等 一般情況下 的記...