placement new的用法及用途

2021-08-03 07:47:39 字數 1343 閱讀 1703

本文**:

所謂placement new就是在使用者指定的記憶體位置上構建新的物件,這個構建過程不需要額外分配記憶體,只需要呼叫物件的建構函式即可。

舉例來說:

class

foo{};

foo* pfoo = new foo;

pfoo指向的物件的位址你是不能決定的,因為new已經為你做了這些工作。第一步分配記憶體,第二步呼叫類的建構函式。

而placement new是怎麼做的呢,說白了就是把原本new做的兩步工作分開來。第一步你自己分配記憶體,第二步你呼叫類的建構函式在自己分配的記憶體上構建新的物件。

placement new的好處:

1)在已分配好的記憶體上進行物件的構建,構建速度快。

2)已分配好的記憶體可以反覆利用,有效的避免記憶體碎片問題。

placement new的標準用法:

class foo

void set_f( float _f )

void get_f()

};

1)分配記憶體

char* buff = new

char[ sizeof(foo) * n ];

memset( buff, 0, sizeof(foo)*n );

2)構建物件

foo* pfoo =new (buff)foo;
3)使用物件

pfoo->print();

pfoo->set_f(1.0f);

pfoo->get_f();

4)析構物件,顯式的呼叫類的析構函式。

pfoo->~foo();
5)銷毀記憶體

delete  buff;
上面5個步驟是標準的placement new的使用方法。

對於buff這塊記憶體可以反覆使用,只要重複2)、3)、4)步驟即可。

placement new還可以解決的乙個問題是建立帶引數的建構函式物件陣列。

**示例如下:

class cpong

private:

int v;

};char* pong = new

char[ sizeof(cpong) * 10 ];

cpong* pp = (cpong*)pong;

for ( int i=0; i<10; ++i )

for ( int j=0; j<10; ++j )

delete pong;

Placement new的用法及用途

什麼是placement new?所謂placement new就是在使用者指定的記憶體位置上構建新的物件,這個構建過程不需要額外分配記憶體,只需要呼叫物件的建構函式即可。舉例來說 class foo foo pfoo new foo pfoo指向的物件的位址你是不能決定的,因為new已經為你做了這...

placement new的標準用法及用途

什麼是placement new?所謂placement new就是在使用者指定的記憶體位置上構建新的物件,這個構建過程不需要額外分配記憶體,只需要呼叫物件的建構函式即可。舉例來說 class foo foo pfoo new foo pfoo指向的物件的位址你是不能決定的,因為new已經為你做了這...

遵循placement new的用法規範

widget p new widget ordinary new 普通的new pi new ptr int pi new ptr int placement new 括號裡的引數是乙個指標,它指向乙個記憶體緩衝器,placement new將在這個緩衝器上分配乙個物件。placement new的...