C 動態儲存空間的分配和釋放

2021-05-26 16:53:17 字數 2181 閱讀 6718

使用new申請空間:

特點:

1、沒有名字,只能通過指標間接訪問它們。

2、從堆中申請空間

分類:

變數:

語法:指標變數 = new 型別名;

delete 指標變數

舉例:int *p;

p=new int;

delete p;

初始化:

*p=90;

p=new int(99);

一維陣列:

語法:指標變數 = new 型別名[下標表示式]; 下標表示式是整型常量或整型表示式

delete [ ]指標變數;---[ ]表明是個陣列,但不需要指出其大小

舉例:int *p;

p= new type[s];

delete [ ]p;

多維陣列(二維陣列):  必須指出所有維的長度

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

delete [ ]變數名

舉例:定義乙個3×4的陣列

int (*p)[4]; p是個指標,它指向乙個n維陣列(4定義的時候必須已知,即後幾維必須已知)

p=new int[3][4];// 第一維可以是常量或表示式,其他維必須全部為常量

delete [ ]p;

物件:可以在建立物件的時候同時進行初始化

語法: 類名 *指標變數 = new 類名(實參表);

物件陣列:

語法:類名 陣列名[元素個數];

或: 類名* 指標名;指標名=new 類名[陣列長度];

舉例:point a[2];

point* p;

*p=new point[5];

delete [ ]p;

初始化:每個物件都要呼叫一次建構函式和一次析構函式。

1)物件陣列確定且長度有限:可以使用引數列表初始化

point a[2]=;

2)物件陣列長度比較大或不確定:只能呼叫無參或者使用預設引數的函式

point a[2];

原因:在建立物件陣列的時候,c++不允許整體對物件進行初始化(即[ ]和( )不能一起使用),這時不能給物件 使用有引數的建構函式

所以:若建立乙個類的物件陣列,就對給類的建構函式有要求:物件陣列只能呼叫乙個不需要引數的建構函式

常見問題:

1):有了malloc/free 為什麼還要new/delete?

malloc/free 只能滿足內部資料型別的變數,它們只需要申請空間,無法對空間進行操作

而對於非內部資料型別的物件來說,物件在建立的同時要自動執行建構函式,在消亡之前要自動執行析構函式。

由於malloc/free 是庫函式而不是運算子,不在編譯器控制許可權之內,不能夠自動地呼叫建構函式和析構函式。即用無法滿足動態物件的要求。

因此 c++語言需要乙個能完成動態記憶體分配和初始化工作的運算子new,以及乙個能完成清理與釋放記憶體工作的運算子delete。

注意new/delete 不是庫函式,而是運算子。malloc/free 是標準庫函式。

2):malloc/free  和 new/delete 的相同點和不同點

相同點:它們都可以申請和釋放空間。

不同點:

一、new :分配記憶體 + 呼叫類的建構函式 + 初始化  delete:釋放記憶體 + 呼叫類的析構函式

malloc:只分配記憶體,不會進行初始化類成員的工作   free只釋放記憶體,不會呼叫析構函式

二、new delete 是運算子,可以進行過載

malloc,free是函式,不可以進行過載

三、new delete 更加安全,簡單:

不用計算型別大小:自動計算要分配儲存區的位元組數

不用強制型別轉換:自動返回正確的指標型別

四、new可以分配乙個物件或物件陣列的儲存空間,malloc不可以

五、可以超載與類相關的new和delete

六、malloc/free 是標準庫函式,new/delete是c++運算子

2):new和delete搭配使用,malloc和free搭配使用:混搭可能出現不可預料的錯誤

3):new後執行的三個操作:(某面試題目)

1、new的類分配記憶體空間。

2、 呼叫類的構造方法。

3 、返回該例項(物件)的記憶體位址

C 之儲存空間的動態分配和釋放

很多時候,我們需要根據問題的實際規模來定義陣列的大小,即確定實際需要使用的儲存空間的大小,這個時候就要用到動態申請 釋放儲存空間的方法。一般情況下,變數儲存空間的分配和釋放是由系統自動完成的,不需要我們的干預。系統對自動分配記憶體的變數的訪問方式有兩種 在程式執行中動態申請 釋放記憶體的變數,只能通...

儲存空間的分配和釋放

在c語言中,記憶體分配提供了四個函式,malloc 函式 calloc 函式 realloc 函式和free 函式,用來實現記憶體的動態分配和釋放。這四個函式屬於stdlib.h這個庫函式中,其中malloc 函式 calloc 函式和realloc 函式都用於動態儲存分配,但有所差別,free 函...

動態儲存空間分配

include include include c 操作符new用來進行動態記憶體分配 他的值為乙個指標指向所分配的空間 c 操作符delete 用來釋放由操作符new所分配的空間 int y new int,y 10 或者int y new int 10 或者 int y y new int 10...