【轉】placement new的標準用法及用途

本文轉自CSDN
 
什麼是placement new?
所謂placement new就是在用戶指定的內存位置上構建新的對象,這個構建過程不需要額外分配內存,只需要調用對象的構造函數即可。
舉例來說:
class foo{};
foo* pfoo = new foo;
pfoo指向的對象的地址你是不能決定的,因爲new已經爲你做了這些工作。第一步分配內存,第二步調用類的構造函數。
而placement new是怎麼做的呢,說白了就是把原本new做的兩步工作分開來。第一步你自己分配內存,第二步你調用類的構造函數在自己分配的內存上構建新的對象。

placement new的好處:
1)在已分配好的內存上進行對象的構建,構建速度快。
2)已分配好的內存可以反覆利用,有效的避免內存碎片問題。
關於Placement new的標準用法,網上有一篇文章 講得很清楚,我這裏再轉述一下。

class  Foo
{
     char  cc;
     float  f;
public :
     void  print() { std::cout  <<   " ADDR:  "   <<   this   <<  std::endl; }
     void  set_f(  float  _f ) { std::cout  <<   " set f val :  "   <<  _f  <<  std::endl; f  =  _f; }
     void  get_f() { std::cout  <<   " get f val :  "   <<  f  <<  std::endl; }
};
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  {
 3  public :
 4      CPong(  int  m ) : v(m) { std::cout  <<   " CPong ctor. "   <<  std::endl; }
 5 
 6  private :
 7       int  v;
 8  };
 9 char *  pong  =   new   char [  sizeof (CPong)  *   10  ];
10 CPong *  pp  =  (CPong * )pong;
11 
12 for  (  int  i = 0 ; i < 10 ;  ++ i )
13 {
14      new  (pp + i)CPong(i);
15 }
16 
17 for  (  int  j = 0 ; j < 10 ;  ++ j )
18 {
19      pp[j]. ~ CPong();
20 }
21 
22 delete [] pong;
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/lazyking/archive/2010/02/23/5319580.aspx
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章