最近在學習C++的過程中,發現指針以及new和delete的使用遍布全書,可見其重要性。在學習了一個階段之後,總結一下new和delete的用法,指針還沒有摸透,待日後總結。
new和delete是C++中的兩個操作符,new用於給單個對象或者數組,結構等分配內存,在內存使用完後,用delete進行釋放內存。而且是一一對應關系,有了new分配了內存,必然需要delete來釋放內存,其分配和釋放的必須是同一地址的內存。不然就很有可能導致內存洩漏的後果,如果內存洩漏嚴重,程序就極有可能崩潰。
在這裡順便介紹三個術語:
(1)聯編(binding):聯編是指一個計算機程序自身彼此關聯(使一個源程序經過編譯、連接,成為一個可執行程序)的過程,在這個聯編過程中,需要確定程序中的操作調用(函數調用)與執行該操作(函數)的代碼段之間的映射關系,按照聯編所進行的階段不同,可分為靜態聯編和動態聯編。
(2)靜態聯編(static binding):是指在編譯階段就將函數實現和函數調用關聯起來,因此靜態聯編也叫早綁定,在編譯階段就必須了解所有的函數或模塊執行所需要檢測的信息,它對函數的選擇是基於指向對象的指針(或者引用)的類型。
(3)動態聯編(dynamic binding):指在程序執行的時候才將函數實現和函數調用關聯,因此也叫運行時綁定或者晚綁定,動態聯編對函數的選擇不是基於指針或者引用,而是基於對象類型,不同的對象類型將做出不同的編譯結果。
然後我們假設需要編寫一個程序,其中需要的數組長度無法在編譯時進行確定,而需要在運行時期確定其中的值,這樣就無法通過聲明一個數組滿足需求了。因為聲明數組後,程序在編譯期間將會為它分配內存,無論程序最終是否使用過數組,這個數組都占用了一定的內存,而且它不夠靈活。所以在這種情況下,我們就需要使用動態聯編。也是用使用new創建動態數組,在運行時分配內存。
代碼實例:
#includeint main() { using namespace std; int * point = new int[3]; //int * point[3] = new int; //This is a wrong way to difine a array point[0] = 1; point[1] = 2; point[2] = 3; cout << "point[0] is " << point[0] << "\n"; cout << "point[1] is " << point[1] << "\n"; cout << "point[2] is " << point[2] << endl; //endl is equal to "\n" delete [] point; //free memory return 0; }
創建動態結構和創建動態數組的方式和思想並沒有太大的出入。直接上實例,在代碼中分析。
struct struct1 //structure definition { char name[20]; float volume; double price; }; int main() { using namespace std; struct1 * ps = new struct1; //allot memory for structure cout << "Enter name of struct1 item: "; cin.get(ps->name,20); cout << "Enter volume in cubic feet: "; cin >> (*ps).volume; //method 2 for memory access cout << "Enter price: $"; cin >> ps -> price; cout << "Name: " << (*ps).name << endl; cout << "Volume: " << ps->volume << " cubic feet\n"; //method 1 cout << "Price: $" << ps->price << endl; //method 2 delete ps; return 0; }簡單說幾點和創建動態數組的不同之處:
<1>創建數組時的指針類型可以根據需求不同可以是int,char,double等等,創建結構時指針類型就只能是結構變量了,也就是上述代碼中的struct1,不能任意的喜歡那個類型就上哪個了。指針方面的不同就不分析了
<2>對於創建數組,分配內存和釋放內存時都有一個[],但是在結構中,就沒有這個[]了。
動態創建對象時,只需指定其數據類型,不必為該對象命名,new表達式返回指向新創建對象的指針,我們通過該指針來訪問此對象。
int main() { using namespace std; int nights = 1001; int * pt = new int; //allocate space for an int *pt = 1001; //store a value there cout << "nights value = "; cout << nights << ": location " << &nights << endl; cout << "int "; cout << "value = " << *pt << ": location = " << pt << endl; double * pd = new double; //allocate space for a double *pd = 10000001.0; //store a value there cout << "double "; cout << "value = " << *pd << ": location = " << pd << endl; cout << "location of pointer pd: " << &pd << endl; cout << ": size of * pt = " << sizeof(*pt) << endl; cout << "size of pd = " << sizeof pd; cout << ": size of *pd = " << sizeof(*pd) << endl; return 0; }最後簡單提一下這段代碼中的nights變量和pd指針的值都存放在棧(stack)中,而用new分配的內存在堆(heap)或者自由存儲區(free store)中。