C語言記憶體管理(記憶體池)

2022-08-14 21:39:23 字數 2192 閱讀 8548

c語言可以使用

alloc

從棧上動態分配記憶體。

malloc/free或者

new/delete

大量使用會造成記憶體碎片,這種碎片形成的機理如下:

記憶體碎片一般是由於空閒的記憶體空間比要連續申請的空間小,導致這些小記憶體塊不能被充分的利用,舉個例子:

如果有100

個單位的連續空閒記憶體,那麼先申請

3單元的連續記憶體,再申請

50單元的記憶體,這時釋放一開始的

3單元的記憶體。這時,如果你一直申請比三單元大的記憶體單元,那麼開始的那連續的三單元就一直不能被使用。

乙個簡單的記憶體池的寫法:

struct

memblock

;struct

mempool

;typedef 

void

(*free_callback)(

void

*);//釋放**函式,釋放

membloc.data

用,可以簡單的直接用

free

函式void

mempool_init(

intinitialsize,

intdatasize);

//初始化

mempool

void

mempool_dealloc(

struct

mempool* pool,free_callback callback);

//釋放

mempool

void

*    mempool_get(

struct

mempool* pool);

//獲取乙個

memblock

void

mempool_release(

struct

mempool* pool,

struct

memblock* block);

//歸還乙個

memblock

/*********************************

* mempool

* ******************************/

//malloc乙個

memblock

static

struct

memblock* mempool_allocblock( 

struct

mempool* pool );

//------------------implement--------

void

*mempool_init( 

intinitialsize, 

intdatasize )

return

( pool );

}void

mempool_dealloc( 

struct

mempool* pool, free_callback callback )

free( block );

}free( pool );

l_debug( "%s:size(%d),unused(%d)", __func__, pool->size, pool->unused );

}static

struct

memblock*

mempool_allocblock( 

struct

mempool* pool )

void

mempool_release( 

struct

mempool* pool, 

struct

memblock* block )

if( block->used != 1 ) 

//將歸還的記憶體塊放到空閒煉表頭。

block->used = 0;

//表示空閒

block->next = pool->free_linkhead;

pool->free_linkhead = block;

pool->unused++;

//空閒數+1}

void

*mempool_get( 

struct

mempool* pool )

else

return

( block );

}來自為知筆記(wiz)

C 記憶體管理 記憶體池

很多內容來自於網際網路,如有侵權,請告知。另外,從 收穫很多,在此表示感謝。我們寫程式經常需要 malloc 和 new 一塊記憶體出來,這些記憶體是在堆上進行分配的,在堆上分配的記憶體和在棧上分配的記憶體不同,可以長久的儲存。堆是什麼 可以把你的程序空間 想象成 4g 大小的記憶體 32 為機子上...

C 記憶體管理 記憶體池

引子 一 單獨類記憶體池 classa intget void operator new size t void operator delete void size t private a next static a freestore 指向可用首位址 static const int achunk...

記憶體池 C 記憶體池

c c 下記憶體管理是讓幾乎每乙個程式設計師頭疼的問題,分配足夠的記憶體 追蹤記憶體的分配 在不需要的時候釋放記憶體 這個任務相當複雜。1.呼叫malloc new,系統需要根據 最先匹配 最優匹配 或其他演算法在記憶體空閒塊表中查詢一塊空閒記憶體,呼叫free delete,系統可能需要合併空閒記...