C 動態記憶體分配

2021-06-28 15:09:11 字數 2534 閱讀 4331

c++動態記憶體分配

c/c++定義了4個記憶體區間:**區,全域性變數與靜態變數區,區域性變數區即棧區,動態儲存區,即堆(heap)區或自由儲存區(free store)。

堆的概念:

通常定義變數(或物件),編譯器在編譯時都可以根據該變數(或物件)的型別知道所需記憶體空間的大小,從而系統在適當的時候為他們分配確定的儲存空間。這種記憶體分配稱為靜態儲存分配;

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

當程式執行到需要乙個動態分配的變數或物件時,必須向系統申請取得堆中的一塊所需大小的存貯空間,用於存貯該變數或物件。當不再使用該變數或物件時,也就是它的生命結束時,要顯式釋放它所占用的存貯空間,這樣系統就能對該堆空間進行再次分配,做到重複使用有限的資源。

堆空間申請、釋放的方法:

在c++中,申請和釋放堆中分配的存貯空間,分別使用new和delete的兩個運算子來完成:    

指標變數名=new 型別名(初始化式);

delete 指標名;

例如:1、 int *pi=new int(0);

它與下列**序列大體等價:

2、int ival=0, *pi=&ival;

區別:pi所指向的變數是由庫操作符new()分配的,位於程式的堆區中,並且該物件未命名。  

堆空間申請、釋放說明:

⑴.new運算子返回的是乙個指向所分配型別變數(物件)的指標。對所建立的變數或物件,都是通過該指標來間接操作的,而且動態建立的物件本身沒有名字。

⑵.一般定義變數和物件時要用識別符號命名,稱命名物件,而動態的稱無名物件(請注意與棧區中的臨時物件的區別,兩者完全不同:生命期不同,操作方法不同,臨時變數對程式設計師是透明的)。

⑶.堆區是不會在分配時做自動初始化的(包括清零),所以必須用初始化式(initializer)來顯式初始化。new表示式的操作序列如下:從堆區分配物件,然後用括號中的值初始化該物件。

⑴.用初始化式(initializer)來顯式初始化 

int *pi=new int(0);

⑵.當pi生命週期結束時,必須釋放pi所指向的目標:

delete pi;

注意這時釋放了pi所指的目標的記憶體空間,也就是撤銷了該目標,稱動態記憶體釋放(dynamic memory deallocation),但指標pi本身並沒有撤銷,它自己仍然存在,該指標所佔記憶體空間並未釋放。 

下面是關於new 操作的說明 

⑴.new運算子返回的是乙個指向所分配型別變數(物件)的指標。對所建立的變數或物件,都是通過該指標來間接操作的,而動態建立的物件本身沒有名字。 

⑵.一般定義變數和物件時要用識別符號命名,稱命名物件,而動態的稱無名物件(請注意與棧區中的臨時物件的區別,兩者完全不同:生命期不同,操作方法不同,臨時變數對程式設計師是透明的)。 

⑶.堆區是不會在分配時做自動初始化的(包括清零),所以必須用初始化式(initializer)來顯式初始化。new表示式的操作序列如下:從堆區分配物件,然後用括號中的值初始化該物件。

①申請陣列空間:

指標變數名=new 型別名[下標表示式];

注意:「下標表示式」不是常量表示式,即它的值不必在編譯時確定,可以在執行時確定。

②釋放陣列空間:

delete [ ]指向該陣列的指標變數名;

注 意:方括號非常重要的,如果delete語句中少了方括號,因編譯器認為該指標是指向陣列第乙個元素的,會產生**不徹底的問題(只**了第乙個元素所佔 空間),加了方括號後就轉化為指向陣列的指標,**整個陣列。delete [ ]的方括號中不需要填陣列元素數,系統自知。即使寫了,編譯器也忽略。

#include

#include

void main(){

int n;

char *pc;

cout<<"請輸入動態陣列的元素個數"<>n; //n在執行時確定,可輸入17

pc=new char[n]; //申請17個字元(可裝8個漢字和乙個結束符)的記憶體空間

strcpy(pc,「堆記憶體的動態分配」);//

cout《指向三維陣列的指標; 

int(*b2) [20];     //二級指標;――>指向二維陣列的指標; 

b3=new int [1] [20] [30]; 

b2=new int [30] [20]; 

刪除這兩個動態陣列可用下式: 

delete b3; //刪除(釋放)三維陣列; 

delete b2; //刪除(釋放)二維陣列;

在堆中建立動態多維陣列

new 型別名[下標表示式1] [下標表示式2]……;

例如:建立乙個動態三維陣列

float (*cp)[30][20] ; //指向乙個30行20列陣列的指標,指向二維陣列的指標

cp=new float [15] [30] [20]; //建立由15個30*20陣列組成的陣列;

注意:cp等效於三維陣列名,但沒有指出其邊界,即最高維的元素數量,就像指向字元的指標即等效乙個字串,不要把指向字元的指標,說成指向字串的指標。這與陣列的巢狀定義相一致。

c語言動態記憶體分配 C 動態記憶體分配

動態記憶體分配 雖然通過陣列就可以對大量的資料和物件進行有效地管理,但是很多情況下,在程式執行之前,我們並不能確切地知道陣列中會有多少個元素。這種情況下,如果陣列宣告過大,就會造成浪費 宣告過小,就會影響處理。在c 中,動態記憶體分配技術可以保證程式在執行過程中按照需要申請適量記憶體,使用後釋放,從...

c 動態記憶體分配

c語言中提供的動態記憶體分配為了解決陣列的靜態的分配方式的問題 即陣列大小必須在定義時指定,程式在執行時不能動態改變陣列的大小 在標準庫中提供了三個動態記憶體分配的函式供程式呼叫,下面將分別對這三個函式進行介紹 1.void malloc size t size malloc 在分配一段連續的記憶體...

C動態記憶體分配

主要初步介紹malloc free calloc realloc的基本。日後會有更詳細的內容。malloc free分別用於動態記憶體分配和釋放。malloc會從記憶體池裡提取一塊合適的記憶體 連續的 並返回指向這塊記憶體 起始位置的指標,該指標的型別為void 指標 因為malloc不知道你請求的...