比如,你寫一個數組用來存放一個班所有人的數學成績,如果你知道這個班一共有50個人,那好辦,直接
int |
這樣編譯器在編譯階段就知道該爲這個數組分配多少內存了,這就叫靜態分配。
那要是這個班的人數是未知的,需要用戶手動輸入來確定呢?
那就需要動態分配了:
void func(int student_count)
{
int grade[] = new int[student_count];
}
|
在這裏由於student_count在編譯時是未知的,所以編譯階段編譯器無法知道需要爲該數組分配多少內存,只有在運行時用戶輸入數據的時候才能確定,所以這就需要運行時爲該數組動態分配內存。
靜態分配的內存在棧裏,每進入一個函數時都會建棧,棧裏會存放函數用到的參數、局部變量等信息,函數執行完以後,會出棧銷燬棧,這個過程就會釋放你靜態分配的數組內存,這是由系統自動完成的。
動態分配的內存,實際在堆上,系統沒法自動幫你去釋放堆上的內存,需要你自己寫free或者delete來告訴操作系統需要幫你去釋放堆上哪個位置的內存。