C new delete相關知識點詳解

2021-06-17 17:34:20 字數 2295 閱讀 4923

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

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

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

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++語言為指標提供delete 表示式釋放指標所指向的陣列空間。

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

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

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

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

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

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

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

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

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

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

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

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

刪除const物件:delete pci;

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

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

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

相關知識點

nweb inf uclasses uweb.xml ulib n 從httpservlet 繼承,重寫doget dopost方法 n部署web.xml n 只有乙個物件 n 第一次請求的時候被初始化,只一遍 n 初始化後先呼叫init 方法,只一遍 n 每個請求,呼叫一遍service serv...

Camera相關知識點

1 camera涉及到的概念 1.1 preview capture video preview 預覽 capture 拍照 video 錄影 1.2 幀率 快門 幀率 frame rate 用於測量顯示幀數的量度。所謂的顯示單位為每秒顯示的幀數,簡稱fps或hz 快門 shutter。快門是攝像器...

CURL相關知識點

1,建立乙個curl的會話資源 ch curl init 設定url,引數傳遞出來的時候 curl setopt ch,curlopt url,url 使用post提交的資料 curl setopt ch,curlopt post,1 if post data 設定是否將響應結果存入變數,1或者tr...