發現兩篇記憶體池的博文,博文位址如下,寫的很好,能避免記憶體碎片和記憶體洩露問題,比我這個玩具**要好很多,大家可以看看:
在我們做專案的時候,經常會分配了記憶體,然後卻忘了釋放,造成記憶體洩漏的問題。
以下**可以實現在**退出的時候自動釋放之前申請但未釋放的記憶體。
其原理是:用乙個雙向鍊錶維護申請的記憶體塊,申請記憶體則插入對應節點,釋放則刪除相應節點;當程式退出的時候,遍歷雙向鍊錶,釋放記憶體,清空雙向鍊錶。
**如下:
#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...