????????上次堆區的介紹中,我們提到了一個關鍵字new,那今天我們就詳細講講它
? ? ? ? 今天我們主要將兩個內容
? ? ? ? 1.new的基本語法
? ? ? ? 2.用new創建數組
1.new的基本語法
? ? ? ? new,可以在堆區中創建空間,來存放數據,就比如像下面這樣
int* p = new int(29);//new會返回空間的地址,所以要用相同類型的指針變量接收
????????基本上用new創建變量的格式:指針類型+指針變量名=new+變量類型+(賦值)?
????????那我們已經知道了怎么創建,現在我們再來講講釋放,就像fopen打開的文件要用,fcolse來關閉,malloc,calloc,realloc動態分配的空間,要用free來釋放一樣,new在堆區中創建的空間也需要delete來刪除(釋放)
delete p;//釋放new在堆區創建的變量
????????我們可以先用new來創建空間,在釋放的前后打印看一下,會有什么效果:
#include<iostream>
using namespace std;
//new的基本語法
int* asd()
{//在堆區開辟空間int* p = new int(29);//new會返回空間的地址,所以要用相同類型的指針變量接收return p;
}void fff()
{int* p = asd();cout << *p << endl;cout << *p << endl;cout << *p << endl;cout << *p << endl;delete p;//釋放new在堆區創建的變量//cout << *p << endl;}int main()
{fff();return 0;
}
????????在釋放前:
?
????????????????我們可以看到,很成功的打印出來了并沒有亂碼出現 ,那接下來我們在看看釋放后的打印結果:
????????我們可以看到,釋放前的打印完了之后,就無法打印了,并出現了訪問權限沖突的問題,這證明了new所創建的空間成功被釋放了。
2.用new創建數組
????????而用new創建一個數組,其實也是異曲同工之妙,只不過細節上有點區別
?? ?int* arr = new int[10];//注意:與創建單個變量不同,它賦值時使用的并不是小括號,而是中括號?
????????用new創建一個數組的基本公式可以概括為:?指針類型+指針數組名=new+變量類型+[元素個數]
????????注意:與創建單個變量不同,它賦值時使用的并不是小括號,而是中括號?
????????那么釋放呢?
?? ?delete[] arr;//new在堆區中創建的數組與變量釋放的格式是不一樣的,數組比變量要多一個中括號。
????????這里呢,它多了一個中括號,表示它是在釋放一個數組。?
????????接下來,我們在上面的代碼的基礎上,創建一個數組,同樣在釋放前后打印,看看結果是不是一樣的。
#include<iostream>
using namespace std;
//new的基本語法
int* asd()
{//在堆區開辟空間int* p = new int(29);//new會返回空間的地址,所以要用相同類型的指針變量接收return p;
}void fff()
{int* p = asd();cout << *p << endl;cout << *p << endl;cout << *p << endl;cout << *p << endl;delete p;//釋放new在堆區創建的變量//cout << *p << endl;}//運用new在堆區創建數組void fds()
{int* arr = new int[10];//注意與創建單個變量不同,它賦值時使用的并不是小括號,而是中括號//為數組賦值for (int i = 0; i < 10; i++){arr[i] = i + 100;//將arr當作數組名加個中括號就可以了,正常結果就是100-109了}//我們來看看賦值是否成功呢?for (int j = 0; j < 10; j++){cout << arr[j] << endl;}delete[] arr;//new在堆區中創建的數組與變量釋放的格式是不一樣的,數組比變量要多一個中括號。/*for (int j = 0; j < 10; j++){cout << arr[j] << endl;}*/
}int main()
{fff();fds();return 0;
}
????????釋放前:
????????釋放后:
?
????????同樣的話我就不再這里水字數了?,希望大家有所收獲
完