c 中關於new語句

2021-09-02 23:34:55 字數 2210 閱讀 2279

當我們使用關鍵字new在堆上動態建立乙個物件時,它實際上做了三件事:獲得一塊記憶體空間、呼叫建構函式、返回正確的指標。當然,如果我們建立的是簡單型別的變數,那麼第二步會被省略。

舉個例子:

(a為某個類)

a

* pa =

newa(3

);

那麼上述動態建立乙個物件的過程大致相當於以下三句話(只是大致上):

a

* pa =(a

*)malloc

(sizeof(a

)); pa-

>a:

:a(3

);return pa;

雖然從效果上看,這三句話也得到了乙個有效的指向堆上的a物件的指標pa,但區別在於,當malloc失敗時,它不會呼叫分配記憶體失敗處理程式new_handler,而使用new的話會的。因此我們還是要盡可能的使用new,除非有一些特殊的需求

一維陣列

1 int *x =

newint

;//開闢乙個存放整數的儲存空間,返回乙個指向該儲存空間的位址(即指標)

2 int *a =

newint

(100);

//開闢乙個存放整數的空間,並指定該整數的初值為100,返回乙個指向該儲存空間的位址

3 char *b =

newchar[10

];//開闢乙個存放字元陣列(包括10個元素)的空間,返回首元素的位址

4 float *p=

newfloat

(3.14159);

//開闢乙個存放單精度數的空間,並指定該實數的初值為將返回的該空間的位址賦給指標變數p

二維陣列

動態申請列大小固定的二維陣列

1

//列值固定

2const int maxcol=3

;3 cin>>row;

4//申請一維資料並將其轉成二維陣列指標

5 int *pp_arr =

newint

[row *

maxcol];

6int

(*p)

[maxcol]=

(int(*

)[maxcol

])pp_arr

動態申請大小不固定的二維陣列

方式1

1 cin>>row>>col;

2 int **p =

newint

*[row];3

for(int i =

0; i < row; i ++)4

訪問資料的方式:直接通過a[i][j]訪問第i行第j列的資料。

優缺點:通過a[i][j]訪問資料容易,但是new的次數太多,釋放空間不容易。

方式2:

1 cin>>row>>col;

2 int *p =

newint

[row*col]

;//這種是當成一維陣列連續開闢的

訪問資料的方式:通過a[i*(row+1)+j]來訪問第i行第j列的資料。

優缺點:訪問資料很方便,且new的次數少,釋放空間容易,但是不便於理解。

> #include using namespace std; int main()

> //賦值

> for(int i = 0; i < row; i ++)

>

> }

> //輸出

> for(int i = 0; i < row; i ++)

>

> cout<}*/

>

//方式2建立

> int *p =

newint

[row*col]

;>

//賦值

>

for(int i =

0;i < row*col;i ++

)>

>

//輸出

>

for(int i =

0; i < row; i ++

)>

> cout<>

}>

return0;

}

c 關於new檔案

new檔案用來管理c 的動態記憶體,這個檔案宣告了幾個全域性空間的函式 不是std空間的函式,全域性空間的函式呼叫時是用全域性作用域解析符 包括operator new 和operator delete的過載 這些函式用於處理動態儲存空間請求。其new的標頭檔案源 ifndef new define...

C 中關於new和delete的使用

1.建立動態陣列 陣列型別的變數有三個重要的限制 陣列長度固定不變,在編譯時必須知道它的長度,陣列只在定義它的塊語句中存在。對於動態分配的陣列,雖然長度是固定的,但是動態分配的陣列不必在編譯時知道其長度,可以 通常也是 在執行時才確定陣列長度 同時,動態分配的陣列一直存在直到程式顯示釋放為止,這樣,...

C 中關於new和delete的使用

在c 中,可以使用new和delete動態建立和釋放陣列或者單個物件 1.建立動態陣列 陣列型別的變數有三個重要的限制 陣列長度固定不變,在編譯時必須知道它的長度,陣列只在定義它的塊語句中存在。對於動態分配的陣列,雖然長度是固定的,但是動態分配的陣列不必在編譯時知道其長度,可以 通常也是 在執行時才...