堆上的內存由程序員申請和釋放,再也不使用的內存沒有釋放掉,致使內存泄漏。內存泄漏的常見場景:程序員
1 指向堆的指針從新賦值函數
char *p1 = (char*)malloc(5);spa
char *p2 = (char*)malloc(5);3d
p1 = p2; //指針p1被指向p2指向的內存地址,可是p1以前指向的內存尚未被釋放掉,那塊內存就變成了孤立內存,沒法釋放了,由於如今沒有指針指向該內存位置,致使內存泄漏。指針
PS: 在對指針賦值前,必定要確保指針當前指向的內存位置不會變成孤立的。blog
2 錯誤的內存釋放內存
假設指針p指向10字節內存,其中包含一個指針np,np指向另外的內存地址。get
此時若是 free(p); 釋放指針p指向的內存,那np指向的內存位置就變成了孤立的,也無法釋放了,內存泄漏。內存泄漏
PS:正確的釋放內存的方法是,先釋放np指向的內存位置,再釋放p指向的內存位置:遍歷
free(p->np);
free(p);
即:每當釋放結構化的元素,該元素又包含指向動態分配的內存位置的指針時,應該先遍歷子內存位置並釋放,再遍歷父節點。
3 申請的內存沒有使用free進行釋放
PS:alloca函數申請的內存是棧上,由系統自動回收,alloca函數申請的內存不須要free釋放。
4 返回值是指針時
char *getPointer()
{
char *p = (char*)malloc(100);
return p;
}
int main()
{
getPointer(); //getPointer函數裏分配了100字節內存,這兒調用getPointer函數可是並無用指針接收返回值,致使沒有指針指向該100字節內存,形成內存泄漏。 system("pause"); return 0; }