本文**:
所謂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的...