自由儲存區記憶體管理

2021-07-27 06:07:07 字數 1147 閱讀 7101

程式執行時動態記憶體分配(dynamic memory allocation)

c++定義了4個記憶體區間:**區,存放程式**;全域性變數與靜態變數區:存放全域性的和靜態的變數與物件;區域性變數區:即棧(stack)區,存放區域性變數;自由儲存區(free store),也稱堆(heap)。

全域性變數在程式開始執行前在全域性區中分配;區域性變數在程式執行到該區域性區域時在棧中分配。但怎樣分配在編譯時就確定了

有些操作在程式執行過程中才能確定,編譯器在編譯時無法為他們預定儲存空間,只能在程式執行時,系統根據程式執行時的要求進行記憶體分配,這種方法稱為動態記憶體分配,動態記憶體分配在自由儲存區執行。

c++中,申請和釋放自由儲存區中分配的儲存空間,分別使用new和delete這兩個運算子來完成。

使用new來分配記憶體:

前面將指標初始化為變數的位址;變數是編譯時分配的、有名稱的記憶體,而指標只是為可以通過名稱直接訪問村委提供別名。指標真正用武之地在於,在執行階段分配未命名的記憶體以儲存值。這種情況下,只能通過指標訪問記憶體,c語言可以用庫函式malloc()分配記憶體,c++提供更好的new操作符。

int * pn = new int; new int告訴程式,需要適合儲存int的記憶體,並使用指標訪問這個值,new返回位址賦值給pn

使用delete釋放記憶體:

int * ps = new int;

delete ps;

delete只能用來釋放使用new分配的記憶體。

使用new建立動態陣列:

程式只需乙個值,可能會宣告乙個簡單變數,比new簡單。

對於大型資料(陣列,字串,結構),應使用new;

如程式陣列取決於執行時使用者提供的資訊,如果通過宣告建立陣列,編譯時就分配記憶體空間,浪費。但是使用new,執行階段建立,不需要則不建立,動態陣列(dynamic array):

int *psome = new int [10]; new操作符返回第乙個元素位址,當程式結束使用記憶體塊時,delete釋放。delete []psome;

這將釋放psome指向的記憶體,但不會刪除指標psome本身。例如,可以將psome重新指向另乙個新分配的記憶體塊,一定要配對使用new和delete,否則將發生記憶體洩漏(memory leak),也就是說,被分配的記憶體再也無法使用了,如果記憶體洩漏嚴重,則程式將由於不斷尋找更多記憶體而終止。

C 自由儲存區記憶體分配

c c 定義了4個記憶體區間 區,全域性變數與靜態變數區,區域性變數區即棧區,動態儲存區,即堆 heap 區或自由儲存區 free store 1 堆的概念 通常定義變數 或物件 編譯器在編譯時都可以根據該變數 或物件 的型別知道所需記憶體空間的大小,從而系統在適當的時候為他們分配確定的儲存空間。這...

學習ios之路 C語言 儲存區記憶體劃分

一.記憶體儲存區的劃分 1.棧區 棧區主要存放函式內部定義的變數,陣列.函式呼叫時,開闢空間,函式執行完畢,空間,空間的開闢與 有系統管理.2.堆區 堆區最大的特點 空間的開闢與釋放有開發人員手動管理.3.全域性區靜態區 主要存放函式外部定義的全域性變數以及靜態變數,空間一旦開闢,就不會 直到應用程...

擴大swap分割槽記憶體

1 執行命令free m命令,檢視swap檔案的大小 2 執行dd命令對其增加記憶體 我這裡增加了3個g的記憶體 3 執行mkswap命令製作乙個swap檔案 mkswap tmp swap 4 執行swapon命令啟動swap檔案 swapon tmp swap 5 現在通過free m 檢視sw...