記憶體管理二

2021-06-08 06:52:42 字數 1536 閱讀 8696

發現兩篇記憶體池的博文,博文位址如下,寫的很好,能避免記憶體碎片和記憶體洩露問題,比我這個玩具**要好很多,大家可以看看:

在我們做專案的時候,經常會分配了記憶體,然後卻忘了釋放,造成記憶體洩漏的問題。

以下**可以實現在**退出的時候自動釋放之前申請但未釋放的記憶體。

其原理是:用乙個雙向鍊錶維護申請的記憶體塊,申請記憶體則插入對應節點,釋放則刪除相應節點;當程式退出的時候,遍歷雙向鍊錶,釋放記憶體,清空雙向鍊錶。

**如下:

#include #include #include struct node

;struct chain

;void initchain();

struct node* initnode(struct node *pn);

int push(struct node *pn);

int removechain(void **id);

int freechain();

void* mymalloc(void **p,int size);

void* mycalloc(void **p,int nsize,int usize);

void* myrealloc(void **p,int size);

void myfree(void **p);

static struct chain chain;//定義乙個鍊錶的靜態變數

/*初始化鍊錶*/

void initchain()

/*初始化乙個鍊錶上的節點*/

struct node* initnode(struct node *pn)

/*加入乙個新的記憶體分配的節點*/

int push(struct node *pn)

else

chain.size++;

return 1;}/*

從鍊錶中移除乙個節點

*/int removechain(void **id)

else

}else

free(first);

chain.size--;

break;

} first=first->nextnode;

} return 1;

}/*清空鍊錶*/

int freechain()

chain.first=null;

chain.last=null;

chain.size=0;

return 1;}/*

自定義的malloc,calloc,realloc,free函式

void **p引數 是儲存分配記憶體位址的變數的位址,根據這個位址與分配記憶體關聯,進行管理

*/void* mymalloc(void **p,int size)

void* mycalloc(void **p,int nsize,int usize)

void* myrealloc(void **p,int size)

void myfree(void **p)

int main()

二 記憶體管理

1 前言 redis記憶體分配庫支援jemalloc linux預設 tcmalloc libc 非linux預設 編譯方式參考makefile。三種記憶體分配方式的比較待以後總結 2 adlist.h adlist.c 基本資料結構是帶頭結點的雙向鍊錶 非迴圈 呼叫依賴zmalloc.h zmal...

linux c 記憶體管理(二)

3.指標與陣列的比較 不同點 陣列 要麼在驚天儲存區域被建立 如全域性陣列 要麼在棧上被建立。陣列名對應著 而不是指向 一塊記憶體,其位址與容量在生命週期內保持不變,只有陣列的內容可以改變。指標 可以隨時指向任意型別的記憶體塊,它的特徵是 可變 所以我們常用指標來操作動態記憶體。兩者特徵比較的例子 ...

Objective C 記憶體管理 二

assign的屬性內部實現 setter方法 setter方法 property nonatomic,assign nsstring name void setname nsstring name getter方法 getter方法 nsstring name 觀察下面 會出現什麼問題?nsstri...