定位new運算子

2021-07-15 01:48:05 字數 928 閱讀 1995

一般的new運算子負責在heap堆中找到乙個足以能夠滿足要求的記憶體塊。

定位new運算子在標頭檔案中。

定位new運算子直接使用傳遞給它的位址,它不負責判斷哪些記憶體單元已被使用,也不查詢未使用的記憶體塊。這將一些記憶體管理的負擔交給了程式設計師。

下面用乙個簡單的程式來說明定位new的用法:

#include "new"

#include "iostream"

using

namespace

std;

int main()

輸出結果:

注:為了方便,這裡使用乙個靜態陣列來為定位new提供記憶體空間。

可以看到,第一次使用定位new時,p2直接使用了我們顯示供給的記憶體。第二次使用定位new時,程式還是直接使用了我們提供的位址,不管它是否已經被使用,而且可以看到新值直接覆蓋在舊值上面。

第三次使用定位new時,由於我們提供了相對於buffer的偏移量,所以新的指標指向的位址與buffer首位址偏移了10個int位元組。

另外一點要說明的是,不同與常規的new運算子,定位new運算子不需要相應的delete運算子來釋放記憶體。因為它本身就不開闢新的記憶體。

簡單來說就是new運算子只是返回傳遞給它的位址,並將其強制轉換為void *,以便能夠賦給任何指標型別。

用將定位new運算子來建立新的類物件後,當該物件消亡是時,程式並不會自動地呼叫其析構函式,所以必須顯示地呼叫析構函式。這個少數的需要顯示呼叫析構函式的情況之一。

需要注意的是,對於使用定位new運算子建立的物件,應以與建立順序相反的順序進行刪除。原因在於,晚建立的物件可能依賴於早建立的物件。另外,僅當所有物件都被銷毀後,才能釋放用於儲存這些物件的緩衝區。

定位new運算子

通常,new 從堆中分配記憶體,但它還有另一種稱為 定位 placement new 運算子,它可以讓我們指定要使用的位置。可以通過這個特性來設定記憶體管 理規程,處理需要通過特定位址進行訪問的硬體或在特定位置建立物件。要使用定位 new 特性,需要包含標頭檔案 new。使用定位 new 運算子時,...

定位 new 運算子

定位 new 運算子 和普通的new 運算子在堆上隨機分配記憶體相比,定位 new 運算子可以在特定的位址位置 定位 new 運算子的具體使用例項 const int buf 512 const int n 5 char buffer buf void part9 newplace 定位new 的其...

new定位運算子

定位new運算子 new負責在堆中找到乙個足以滿足要求的記憶體塊,它讓你能夠指定要使用的位置。標頭檔案 include include define max 50 using namespace std char buff max class justtest justtest int tmain ...