一、C++中的動態記憶體管理方式 C語言中的動態管理方式是用malloc、free函數,它們在C++仍然可以繼續使用,但是由於在部分地方略顯無能為力,且使用起來比較麻煩,所以C++提出了自己的記憶體管理方式:採用new、delete關鍵字去進行動態記憶體管理。 註意:C語言開闢空間所用的malloc、ca ...
一、C++中的動態記憶體管理方式
C語言中的動態管理方式是用malloc、free函數,它們在C++仍然可以繼續使用,但是由於在部分地方略顯無能為力,且使用起來比較麻煩,所以C++提出了自己的記憶體管理方式:採用new、delete關鍵字去進行動態記憶體管理。
註意:C語言開闢空間所用的malloc、calloc、free等,這些都屬於函數,但是C++所使用的new和delete是關鍵字(或者說是運算符),這一點是本質上的區別。
二、new和malloc的區別
① malloc是按位元組開闢記憶體,返回值類型是void*,需要對返回值類型進行強轉,只管開闢記憶體,不進行初始化。初始化操作需要額外書寫。
而new在堆中開闢記憶體時不僅可以指定其類型,還可以進行記憶體初始化的操作。
② malloc記憶體開闢是否成功是通過返回值與空指針nullptr去比較;
而new開闢記憶體是否成功,是通過是否拋出bad_alloc類型的異常來判斷的。
當new申請記憶體失敗時,會拋出bad_alloc異常,那麼我們該如何去捕獲異常、如何去處理呢?
這裡有篇文章可供參考:https://blog.csdn.net/qq_39846523/article/details/108681889
1 #include<iostream> 2 3 using namespace std; 4 5 int main() 6 { 7 // malloc開闢int類型變數的記憶體空間 8 int *p = (int*)malloc(sizeof(int)); 9 if(p == nullptr) 10 { 11 return -1; 12 } 13 *p = 20; 14 free(p); 15 16 // new開闢int類型變數的記憶體空間 17 int *p1 = new int (20); // int *p1 = new int (); 和 int *p1 = new int; 表示*p1初始值為0 18 delete p1; 19 20 /**********************************************************/ 21 22 // malloc開闢int類型數組的記憶體空間 23 int *q = (int*)malloc(sizeof(int) * 20); 24 if(q == nullptr) 25 { 26 return -1; 27 } 28 free(q); 29 30 // new開闢int類型數組的記憶體空間 31 int *q1 = new int[20](); // 20個 int sizeof(int) * 20 32 // int *q1 = new int[20]; 表示將數值全部初始化為0 33 delete [] q1; // 註意這裡[]放在q1前面!!! 34 35 return 0; 36 }用malloc和new開闢了單個變數和數組的記憶體空間的例子
三、new有多少種?(面試題)
① 拋出異常的new
int *p1 = new int (20);
② 不拋出異常的new
int *p2 = new (nothrow) int;
③ 在堆上生成常量對象or變數的new
const int *p3 = new const int (40); // 常量要用常量指針去指
④ 定位new(在一塊已經定位好的記憶體上,劃分一個指定類型的空間,並可以填上初始值。)
int data = 0;
int *p4 = new (&data) int (50);
cout << data; // 最後輸出結果是50