定位new運算子

2021-06-21 21:25:17 字數 2133 閱讀 4534

通常,new 從堆中分配記憶體,但它還有另一種稱為 定位(placement)new 運算子,它可以讓我們指定要使用的位置。可以通過這個特性來設定記憶體管

理規程,處理需要通過特定位址進行訪問的硬體或在特定位置建立物件。

要使用定位 new 特性,需要包含標頭檔案 new。使用定位 new 運算子時,變數後面可以有方括號,也可以沒有。下面**中同時使用了傳統的 new 運算

符和定位 new 運算子:

// newplace.cpp -- using placement new

#include #include // 使用定位 new 所需要的標頭檔案

const int buf = 512;

const int n = 5;

char buffer[buf]; // 陣列緩衝區

int main()

~justtesting()

void show() const

};int main()

執行輸出:

just testing constructed

heap1 constructed

memory block addresses:

buffer: 004d8800    heap: 00658ef0

memory contents:

004d8800: just testing, 0

00658ef0: heap1, 20

bad idea constructed

heap2 constructed

memory contents:

004d8800: bad idea, 6

004d8aa0: heap2, 10

heap1 destroyed

heap2 destroyed

done

上面程式中,定位 new 運算子建立的第 2 個物件覆蓋了第 1 個物件的記憶體單元。因此必須自己管理好緩衝區的記憶體單元分配,將不同的物件放在緩衝區的不同位址上,以確保兩個記憶體單元不重疊,如:

pc1 = new (buffer) justtesting;

pc3 = new (buffer + sizeof (justtesting)) justtesting("better idea", 6);

另外,delete 刪除 pc2 和 pc4 時,自動呼叫了 pc2 和 pc4 指向物件的析構函式;然而,在將 delete 用於 buffer 時,確實釋放了由 new 分配的陣列記憶體塊,

但這並不會為定位 new 運算子建立的物件呼叫析構函式。

這個可以從函式中的輸出可以看到,析構函式只宣布了 "heap1" 和 "heap2" 的死亡,卻沒有宣布 "just testing" 和 "bad idea" 的死亡。

解決上述沒有呼叫析構函式問題的方法是,顯示為定位 new 運算子建立的物件呼叫析構函式,這也是顯示呼叫析構函式的少數幾種情形之一。

顯示呼叫析構函式,必須指定要銷毀的物件。由於有指向物件的指標

,因此可以如下呼叫析構函式:

pc3->~justtesting();

pc1->~justtesting();

加入合適的delete和顯式的析構函式呼叫,能夠解決這樣的問題,但是需要注意的一點是正確的刪除順序。對於使用定位new運算子建立的物件,應以與建立順序相反的順序進行刪除。原因在於,晚建立的物件可能依賴於早建立的物件。另外,僅當所有物件都被銷毀後,才能釋放用於儲存這些物件的緩衝區。

#include #include #include using namespace std;

const int buf = 512;

class justtesting

~justtesting()

void show() const

};int main()

還需要注意的是,呼叫析構函式的正確順序。對於使用定位 new 運算子建立的物件,應該和建立的順序相反。因為,晚建立的物件可能依賴於早建立的物件。另外,僅當所有物件都被銷毀後,才能釋放用於儲存這些物件的緩衝區。

定位 new 運算子

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

定位new運算子

一般的new運算子負責在heap堆中找到乙個足以能夠滿足要求的記憶體塊。定位new運算子在標頭檔案中。定位new運算子直接使用傳遞給它的位址,它不負責判斷哪些記憶體單元已被使用,也不查詢未使用的記憶體塊。這將一些記憶體管理的負擔交給了程式設計師。下面用乙個簡單的程式來說明定位new的用法 inclu...

new定位運算子

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