熱點

當前位置 /首頁/範文/熱點/列表

C++new相關知識點詳細解析

每個程式在執行時都佔用一塊可用的記憶體空間,用於存放動態分配的物件,此記憶體空間稱為程式的自由儲存區(free store)或堆(heap)。C語言用一堆標準庫函式malloc和free在自由儲存區中分配儲存空間,而C++則用new和表示式實現相同的功能。

C++new相關知識點詳細解析

一、new和建立和釋放動態陣列:

陣列型別的變數有三個重要的限制:陣列長度固定,在編譯時必須知道其長度,陣列只在定義它的語句記憶體在。動態陣列:長度固定,編譯時不必知道其長度,通常是執行時確定;一直存在,直到程式顯示釋放它。

1、動態陣列的定義:陣列變數通過指定型別、資料名和維數來定義。而動態分配陣列時,只需指定型別和陣列長度,不必為陣列物件命名,new表示式返回指向新分配陣列的第一個元素的指標:int*pia=new int[10];在自由儲存區中建立的陣列物件沒有名字,只能通過其地址間接訪問堆中的物件。

2、初始化動態分配的陣列:若陣列元素具有類型別,將使用該類的預設建構函式初始化;若陣列元素是內建型別,則無初始化。也可跟在陣列長度後面的一堆空圓括號,對陣列元素做值初始化。

string *psa=newstring[10]; //array of 10 empty strings

int *pia=newint[10]; //array of 10 uninitializedints

int *pia2=newint[10](); //array of 10 zero

對於動態分配的陣列,其元素只能初始化為元素型別的預設值,而不能像陣列變數一樣,用初始化列表為陣列元素提供各不相同的初值。

3、const物件的動態陣列:若在堆中建立的陣列儲存了內建型別的const物件,則必須為這個陣列提供初始化:因陣列元素都是const物件,無法複製。

const int*pci_ok=new const int[100]();

C++允許定義類型別的const陣列,但該型別必須提供預設建構函式。

已建立的常量元素不允許修改,所以此類陣列用處不大。

4、允許動態分配空陣列:動態分配陣列,多是由於編譯時不知道陣列長度。

size_t n=get_size(); int*p=new int[n];

C++雖然不允許定義長度為0的陣列變數,但明確指出,呼叫new建立長度為0的陣列是合法的`。new返回有效的非零指標。該指標不能與new返回的其他指標不同,不能進行解引用操作,因它沒指向任何元素。允許的操作:比較運算。

5、動態空間的釋放:程式設計師必須顯示將其佔用的儲存空間返還給程式的自由儲存區。C++語言為指標提供 []表示式釋放指標所指向的陣列空間。

[] pia;[]告訴編譯器該指標指向的是堆中的陣列,而非單個物件,若遺漏,編譯器無法發現。

二、new和建立和釋放單個物件

定義變數時,必須指定其資料型別和名字。而動態建立物件時,只需指定其資料型別。new返回指向新建立物件的指標,通過該指標來訪問此物件。

1、動態建立物件的初始化:int *pi=new int(1024)

2、動態建立物件的預設初始化:若不提供顯式初始化,與函式內定義的變數初始化方式相同,類型別->預設建構函式;內建型別->無初始化。同樣可做值初始化:

int *pi=newint();值初始化的()必須置於型別名後,而非變數後,int x()是宣告函式。

3、撤銷動態建立的物件:程式設計師必須顯示將該物件佔用的記憶體返回給自由儲存區。,若指標指向不是用new分配的記憶體地址,則對該指標使用非法。

int i; int *pi=&i; pi;//編譯器不能斷定一個指標指向什麼型別的物件,因此大部分編譯器仍能通過(VS2005編譯通過,執行到該處報錯)。

4、零指標的刪除:int *ip=0; ip;若指標值為0,則合法。

5、後,重設指標值: p;刪除指標後,p成為懸垂指標。懸垂指標指向曾經存放物件的記憶體,但該物件已不存在,引用該記憶體報錯。所以一旦刪除指標所指向的物件,立即將指標置為0。

6、const物件的動態分配和回收:建立時初始化,且一經初始化,其值不可修改。

const int*pci=new const int(1024);new表示式返回int型const物件的指標。所以只能賦給指向const的指標。內建型別物件或未提供預設建構函式的類型別物件必須顯示初始化。

刪除const物件: pci;

三、與動態記憶體分配相關的三種常見程式錯誤:

1、刪除指向動態分配記憶體的指標失敗,稱為memory leak。一般需等程式執行一段時間,耗盡記憶體時,才顯露出來。

2、讀寫已刪除的物件。若刪除指標所指物件後,置指標值為0,易檢查出此類錯誤。

3、對同一個記憶體空間使用兩次表示式。第二次時,自由儲存區可能被破壞。

TAG標籤:解析 Cnew 知識點 #