【011】如何避免內存泄露

如果程序很長時間(例如在服務器上),並且在不停地申請新內存塊,忘記釋放那些已經不再有用的老內存塊,將遲早把內存消耗殆盡,直接導致後邊的NEW操作無法執行,甚至是崩潰。

棧空間往下生長,堆空間往上生長。

這樣的編程漏洞成爲內存泄露(memory leak).
new語句所返回的地址是訪問這個內存塊的唯一線索,同時也是delete用來把這個內存塊歸還給內存池的唯一線索。


//===============================================
int *x;
x = new int[1000];
delete[] x;
x = NULL;
如果這個地址值(保存在x裏)丟失了,就會發生內存泄露。

地址值會因爲很多原因而丟失。比如因爲一個指針變量被無意中改寫。
如:
int *x;
x = new int[3000];
x = new int[4000];
delete[] x;
x = NULL;

會導致內存泄露的另一種情況是用來保存內存塊地址的指針變量作用域問題。
如:
void foo()
{
  My Class *x;
  x = new MyClass();
}
當foo()函數結束時,指針變量x將超出它的作用域,這意味着它將不復存在,它的值當然會丟失。

//===========================================================
有兩種辦法可以用來堵住這樣漏洞:
①在return語句之前的某個地方插入一條delete x語句。
void foo()
{
  MyClass *x;
  x = new MyClass();
  delete x;
  x = NULL;
  return ;
}

②讓函數把函數把內存塊的地址返回給它的調用者
MyClass *foo()
{
  MyClass *x;
  x = new MyClass();
  
  return x;
}

//=================================================
動態分配的內存塊沒有作用域,但是用來保存其地址的指針變量是受作用域影響的。
動態內存由程序員來分配,所以要在不用的時候收回。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章