當我們使用關鍵字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.建立動態陣列 陣列型別的變數有三個重要的限制 陣列長度固定不變,在編譯時必須知道它的長度,陣列只在定義它的塊語句中存在。對於動態分配的陣列,雖然長度是固定的,但是動態分配的陣列不必在編譯時知道其長度,可以 通常也是 在執行時才...