举例来说:
class foo{};
foo* pfoo = new foo;
pfoo指向的对象的地址你是不能决定的,因为new已经为你做了这些工作。第一步分配内存,第二步调用类的构造函数。
而placement new是怎么做的呢,说白了就是把原本new做的两步工作分开来。第一步你自己分配内存,第二步你调用类的构造函数在自己分配的内存上构建新的对象。
placement new的好处:
1)在已分配好的内存上进行对象的构建,构建速度快。
2)已分配好的内存可以反复利用,有效的避免内存碎片问题。
class Foo
{
char cc;
float f;
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; }
};
memset( buff, 0 , sizeof (Foo) * N );
pfoo -> get_f();
代码示例如下:
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;