內存泄漏

 堆上的內存由程序員申請和釋放,再也不使用的內存沒有釋放掉,致使內存泄漏。內存泄漏的常見場景:程序員

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;  }

相關文章
相關標籤/搜索