c 動態申請空間

2021-06-22 11:24:50 字數 2178 閱讀 7033

使用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 (建構函式 析構函式 動態申請空間)

include include using namespace std 整型陣列 class intarray 動態陣列 修改元素 void intarray mod int index,int value 定位指定下標元素 int intarray at int index 構造方法 intarr...

C語言動態申請

由於陣列在宣告的時候總要顯式的指定乙個長度,容易造成空間浪費或者空間不夠用,使用不夠靈活,所以使用了動態的申請 動態空間與直接宣告的變數不同,直接宣告的變數在棧記憶體中,當 塊執行完畢,棧記憶體的變數會自動釋放 但是動態申請的變數在堆記憶體中,塊執行完畢後如果不手動釋放這塊記憶體,它也仍然被占用,就...

順序表的動態申請空間版本

順序表的動態申請空間版本 動態順序表仍需建立乙個結構體 typedef int datatype 定義datatype型別 typedef struct seqlist seqlist,pseqlist 每次插入新元素時,都需判斷是否現有空間已滿,所以用checkcapacity 函式來檢測容量,所...