Placement new的用法及用途

2021-07-22 21:00:03 字數 1679 閱讀 2965

什麼是placement new?

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

舉例來說:

class foo{};

foo* pfoo = new foo;

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

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

placement new的好處:

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

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

關於placement new的標準用法,網上

有一篇文章

講得很清楚,我這裡再轉述一下。

class

foovoid

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還可以解決的乙個問題是建立帶引數的建構函式物件陣列。

**示例如下:

1 class

cpong

2  5 

6  private

: 7 

intv; 8 

}; 9 

char

*pong 

=new

char

[ sizeof

(cpong) *10

];10 

cpong

*pp 

=(cpong

*)pong;

11 

12  for

( int i=

0; i

<

10; 

++i )

13 

16 

17  for

( int j=

0; j

<

10; 

++j )

18 

21 

22  delete  pong;

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的...