從堆區申請空間,我們在C語言中有malloc、calloc、realloc,但是,我們在C++語言中,我們則是用new和delete來替代他們,
首先,我們來比較一下C中用來申請堆區空間的三個方法(malloc、calloc、realloc):
1.malloc回傳一個void指標,C++不允許將void賦值給其他任何指標,必須要強轉,
2.malloc可能會申請記憶體失敗,所以必須判斷回傳值來確保記憶體分配成功,
3.malloc不會呼叫建構式,free不會呼叫構析函式(這是最最最重要的一點...),
而...new 和delete都有兩個作用,如下
1,new有2個作用
- 開辟記憶體空間,
- 呼叫建構式,
2,delete也有2個作用
- 釋放記憶體空間
- 呼叫解構式,
清楚了C++為什么用new和delete后,我們再來明白new的用法-------
1.new 給基本型別申請空間
1 void tesk1() 2 { 3 //基本型別 4 int *p = NULL; 5 6 //p = (int *)calloc(1,sizeof(int)); 7 //p = new int(100); --->*p = 100; 8 9 p = new int; 10 *p = 100; 11 cout<<"*p="<<*p<<endl;//100 12 13 //free(p);釋放 14 delete p; 15 }
2.new 申請基本型別陣列空間
1 void tesk1() 2 { 3 //申請 int陣列 4 int *arr = NULL; 5 //arr = (int *)calloc(5,sizeof(int)); 6 arr = new int[5];//申請空間的時候內容初始化,值隨機 //arr = new int[5]{1,2,3,4,5};內容不隨機 7 8 int i = 0; 9 for(i=0;i<5;i++) 10 { 11 cout<<arr[i]<<" "; 12 } 13 cout<<endl; 14 15 //釋放 new時加[] delete也必須加[] 16 delete [] arr; 17 } 18 int main(int argc, char *argv[]) 19 { 20 tesk1(); 21 return 0; 22 }
注意:
new 沒有加[] delete釋放的時候就不加[]
new 加 [] delete釋放的時候加 []
3、new delete 給類物件申請空間

有一些地方會用new和delete申請物件陣列
我們先簡單的了解一下物件陣列----本質是陣列,只是陣列的每個元素是類的物件
舉兩個例子...
1...
1 void tesk3() 2 { 3 //物件陣列 arr1 是陣列,每個元素是Person型別的物件 4 //定義物件陣列的時候,系統會自動給陣列中的每個元素呼叫建構式 5 //自動呼叫無參構造 6 Person arr1[5]; 7 } 8 //會呼叫5次無參函式和5次解構式
2.如果想讓物件陣列中的元素呼叫有參構造,必須人為使用有參構造初始化...
1 void tesk5() 2 { 3 //物件陣列 arr1是陣列,每個元素是Person型別的物件 4 //定義物件陣列的時候,系統會自動給陣列中的每個元素呼叫解構式 5 //人為 為元素呼叫有參析構 6 //初始化部分,呼叫有參構造為初始化部分自動呼叫默認構造(無參構造) 7 Person arr1[5] = {Person("lucy",18),Person("bob",20)}; 8 //arr1[0] 第0個元素 就是Person的物件 9 arr1[0].showPerson(); 10 arr1[1].showPerson(); 11 }
3、用new delete申請 物件陣列
1 void tesk06() 2 { 3 //第一種方式 4 Person *arr = NULL; 5 arr = new Person[5];//呼叫無參構造 6 7 delete [] arr; 8 9 //第二種方式: 10 //初始化的元素,呼叫有參構造,沒有初始化的呼叫無參構造 11 Person *arr2 = new Person[5]{Person("lucy",18),Person("bob",,20)}; 12 (*(arr2+0)).showPerson(); 13 arr[0].showPerson(); 14 (arr2+1)->showPerson(); 15 delete [] arr2; 16 }
4.盡量不要delete 釋放 void *(void *萬能指標...)
5、malloc、free和new、delete 不可以混搭使用...
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/54941.html
標籤:C++
下一篇:c++編程基礎問題,有關&的意義
