首頁 > 軟體

C++深入講解new與deleted關鍵字的使用

2022-05-21 13:01:31

可執行程式的虛擬地址空間

  1. 核心:存放作業系統
  2. 棧區:函數的形參,非靜態的區域性變數,函數現場 保護資料等等,棧是向下增長的。
  3. 共用庫的記憶體對映區域:用於裝載一個共用的動態記憶體庫。使用者可使用系統介面建立共用記憶體,做程序間通訊。
  4. 堆區:用於程式執行時動態記憶體分配,堆是可以上增長的。
  5. 資料:儲存全域性資料和靜態資料,分為.bss和.data 。
  6. 程式碼:可執行的程式(機器指令)和常數資料。

1.new的運運算元用法(關鍵字)

int* p= new int(10);

這裡的new的用法是當作運運算元的用法,該用法一共有四個步驟:

  1. 計算型別
  2. 申請一個空間(因為new的底層是malloc)
  3. 將所取得的空間初始化
  4. 將申請到的地址返回

2.new的函數用法

new當作函數用法使用的是時候,類似malloc,都是申請一個空間,區別在於,返回值不同;當空間不足時malloc會返回一個“nullptr”,operator new會返回一個throw_bad的異常。

當我們加入一個nothrow後:

這樣申請錯誤後,我們返回的是空指標。

對於malloc我們不可以進行初始化,new也不可以初始化。

所以當new作為函數時就相當於malloc。

3.定位new

定位new用法與構造new十分相似,是在已經確定的空間當中,構造一個物件,並將該物件放置到宣告的空間當中。

int main()
{
	int n = 10;
	int* ipa = (int*)ma11oc(sizeof(int));
	int* ipb = (int*) : :operator new(sizeof(int) * n);
	new(ipa) int(20);
	new(ipb) int[]{ 1,2,3,4,5,6,7,8,9 };
	free(ipa);
	: :operator delete(ipb);
	return 0;
}

不需要開闢相應的空間 合法空間即可 給出某個地址 即可根據要求進行相應操作。

4.new建立物件

new建立物件特點:

  1. new建立物件需要指標接收,一處初始化,多處使用。
  2. new建立物件使用完需delete銷燬。
  3. new建立物件直接使用堆空間,而區域性不用new定義物件則使用棧空間。
  4. new物件指標用途廣泛,比如作為函數返回值、函數引數等。
  5. 頻繁呼叫場合並不適合new,就像new申請和釋放記憶體一樣。

new建立物件例子:

CTest*  pTest = new  CTest();
delete pTest;

pTest用來接收物件指標。

不用new,直接使用類定義申明:

CTest  mTest;

此種建立方式,使用完後不需要手動釋放,該類解構函式會自動執行。

而new申請的物件,則只有呼叫到delete時再會執行解構函式,如果程式退出而沒有執行delete則會造成記憶體漏失。

C Test*  pTest = NULL;

但使用普通方式建立的類物件,在建立之初就已經分配了記憶體空間。

這類指標,如果未經過物件初始化,則不需要delete釋放。

5.delete

delete運運算元使用的一般格式為

 delete [ ]指標變數

例如要復原上面用new開闢的空間用:

delete p; 

如果我們用“new char[10];”開闢的字元陣列空間,把new返回的指標賦給了指標變數pt,則應該用以下形式的delete運運算元復原該空間:

  delete [] pt;

一般來說delete與new需要配對使用。

6.對於內建型別new/delete/malloc/free可以混用

  1. new/delete是C++中的運運算元。malloc / free是函數。
  2. malloc申請記憶體空間時,手動計算所需大小,new只需型別名,自動計算大小;
  3. malloc申請的記憶體空間不會初始化,new可以初始化;
  4. malloc的返回值為void*,接收時必須強轉,new不需要;
  5. malloc申請記憶體空間失敗時,返回的是NULL,使用時必須判空;new申請記憶體空間失敗時返回異常

7.使用注意事項

動態分配失敗,則返回一個空指標(NULL),表示發生了異常,堆資源不足,分配失敗。

指標刪除與堆空間釋放。刪除一個指標p(delete p;)實際意思是刪除了p所指的目標(變數或物件等),釋放了它所佔的堆空間,而不是刪除p本身(指標p本身並沒有復原,它自己仍然存在,該指標所佔記憶體空間並未釋放),釋放堆空間後,p成了空指標。

記憶體漏失(memory leak)和重複釋放。new與delete 是配對使用的, delete只能釋放堆空間。如果new返回的指標值丟失,則所分配的堆空間無法回收,稱記憶體漏失,同一空間重複釋放也是危險的,因為該空間可能已另分配,所以必須妥善儲存new返回的指標,以保證不發生記憶體漏失,也必須保證不會重複釋放堆記憶體空間。

動態分配的變數或物件的生命期。我們也稱堆空間為自由空間(free store),但必須記住釋放該物件所佔堆空間,並只能釋放一次,在函數內建立,而在函數外釋放,往往會出錯。

要存取new所開闢的結構體空間,無法直接通過變數名進行,只能通過賦值的指標進行存取。

用new和delete可以動態開闢和復原地址空間。在程式設計序時,若用完一個變數(一般是暫時儲存的資料),下次需要再用,但卻又想省去重新初始化的功夫,可以在每次開始使用時開闢一個空間,在用完後復原它。

到此這篇關於C++深入講解new與deleted關鍵字的使用的文章就介紹到這了,更多相關C++ new與deleted內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com