C 中如何在指定的記憶體中建立新物件

2021-07-11 21:24:00 字數 1477 閱讀 2663

在free store或者是heap中動態建立程式所需物件時,很多人都知道,用 new 就可以了。那麼如何在指定的記憶體空間中建立物件?就比如要在0x320f8該記憶體位址上動態建立乙個int型別,怎麼破?

c++提供了幾種特點來方便實現在預先決定的記憶體位置構造乙個物件的任務。在這些特點中,包括乙個特殊形式的new操作符,叫做「定位new」(placement new)操作,以及乙個顯式的析構處理。

使用步驟

在很多情況下,placement new的使用方法和其他普通的new有所不同。這裡提供了它的使用步驟。

有三種方式:

1.為了保證通過placement new使用的快取區的memory alignmen(記憶體佇列)正確準備,使用普通的new來分配它:在堆上進行分配

class task ;

char * buff = new [sizeof(task)]; //分配記憶體

(請注意auto或者static記憶體並非都正確地為每乙個物件型別排列,所以,你將不能以placement new使用它們。)

2.在棧上進行分配

class task ;

char buf[n*sizeof(task)]; //分配記憶體

3.還有一種方式,就是直接通過位址來使用。(必須是有意義的位址)

void* buf = reinterpret_cast (0xf00f);

在剛才已分配的快取區呼叫placement new來構造乙個物件。

task *ptask = new (buf) task

第三步:使用

按照普通方式使用分配的物件:

ptask->memberfunction();

ptask-> member;

一旦你使用完這個物件,你必須呼叫它的析構函式來毀滅它。按照下面的方式呼叫析構函式:

ptask->~task(); //呼叫外在的析構函式

你可以反覆利用快取並給它分配乙個新的物件(重複步驟2,3,4)如果你不打算再次使用這個快取,你可以象這樣釋放它:

1.用placement new 解決buffer的問題

問題描述:用new分配的陣列緩衝時,由於呼叫了預設建構函式,因此執行效率上不佳。若沒有預設建構函式則會發生編譯時錯誤。如果你想在預分配的記憶體上建立物件,用預設的new操作符是行不通的。要解決這個問題,你可以用placement new構造。它允許你構造乙個新物件到預分配的記憶體上。

2.增大時空效率的問題

使用new操作符分配記憶體需要在堆中查詢足夠大的剩餘空間,顯然這個操作速度是很慢的,而且有可能出現無法分配記憶體的異常(空間不夠)。

placement new就可以解決這個問題。我們構造物件都是在乙個預先準備好了的記憶體緩衝區中進行,不需要查詢記憶體,記憶體分配的時間是常數;而且不會出現在程式執行中途出現記憶體不足的異常。所以,placement new非常適合那些對時間要求比較高,長時間執行不希望被打斷的應用程式。

如何在mysql中建立記憶體表 轉

如何在mysql中建立記憶體表 轉 如何建立記憶體表?建立記憶體表非常的簡單,只需註明 engine memory 即可 create table tablename columnname varchar 256 not nul engine memory default charset latin...

如何在c 中檢測記憶體洩漏

在visual studio系列的ide中,可以使用 crtsetdbgflag函式來檢測記憶體洩漏 int main 注意,crtsetdbgflag需要在剛進入main函式時呼叫,在 crtsetdbgflag 和return 0之間的所有記憶體洩漏都可以被檢測到,假如有下面的 int main...

C 如何在類中建立執行緒

一般我們在啟執行緒時,都是把執行緒函式寫成全域性函式來使用,但是如果要把執行緒操作寫成類,執行緒函式放在類裡面在c 編譯會不通過。在c 類中建立執行緒會有報錯 下面以乙個簡單的類進行舉例 external.件 ifndef radio external h define radio external...