c++ placement new的标准用法及用途

原文地址:http://blog.csdn.net/lazyking/article/details/5319580

什么是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还可以解决的一个问题是建立带参数的构造函数对象数组。

代码示例如下:

class CPong
{
public:
    CPong(int m) : v(m) { std::cout << " CPong ctor." << std::endl; }

private:
    int v;
};

char *pong = new char[sizeof(CPong) * 10];
CPong *pp = (CPong *)pong;

for ( int i = 0; i < 10; ++i)
{
    new(pp + i)CPong(i);
}

for ( int j = 0; j < 10; ++j)
{
    pp[j].~ CPong();
}

delete [] pong;

 

posted on 2013-03-23 10:58  zhuyf87  阅读(433)  评论(0编辑  收藏

导航