placement new的用法及用途


什么是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 charsizeof(Foo) * N ];
memset( buff, 0sizeof(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 charsizeof(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;
 
 
參考 http://www.cppblog.com/kongque/archive/2010/02/20/108093.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM