棧空間往下生長,堆空間往上生長。
這樣的編程漏洞成爲內存泄露(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;
}
//=================================================
動態分配的內存塊沒有作用域,但是用來保存其地址的指針變量是受作用域影響的。
動態內存由程序員來分配,所以要在不用的時候收回。