Placement new的用法及用途

转载 2015年11月20日 15:34:09

转自:http://www.cppblog.com/kongque/archive/2010/02/20/108093.html

什么是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, 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 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;

Placement new的用法及用途

所谓placement new就是在用户指定的内存位置上构建新的对象,这个构建过程不需要额外分配内存,只需要调用对象的构造函数即可。 举例来说: class foo{}; foo* pfoo = ne...

placement new的标准用法及用途 .

出处:http://blog.csdn.net/lazyking/article/details/5319580  什么是placement new? 所谓placement new就是在...
  • helonSY
  • helonSY
  • 2011年10月13日 23:32
  • 365

(转)遵循placement new的用法规范

标准的开始由一个特别的操作符new来定义,这个就是我们熟知的placement new。和其他普通的new不同的是,它在括号里多了另外一个参数。比如:Widget * p = new Widget; ...

C++ placement new 用法举例zz

http://www.blogjava.net/dongwq/archive/2010/04/20/318874.html   C++ placement new 用法举例zz 2009-12-...
  • fjiale
  • fjiale
  • 2012年07月22日 00:06
  • 410

placement new详解

  • 2012年03月07日 00:43
  • 29KB
  • 下载

C++中placement new操作符(经典)

C++中placement new操作符(经典)

[STL] 空间置配器中的placement_new

以前只知道new和operator new,看了《STL源码剖析》,才知道空间置配器使用了placement_new,这也是为了将内存分配和对象构造分开,进行更好的精细控制。...

【编程语言】C++ 中的placement new

"placement new"? 它 到底是什么东东呀?我也是最近几天才听说,看来对于C++我还差很远呀!placement new 是重载operator new的一个标准、全局的版本,它不能被自定...

C++中placement new操作符(经典)

placement new是重载operator new的一个标准、全局的版本,它不能被自定义的版本代替(不像普通的operator new和operator delete能够被替换成用户自定义的版本...

C++中placement new操作符(经典)

placement new是重载operator new的一个标准、全局的版本,它不能被自定义的版本代替(不像普通的operator new和operator delete能够被替换成用户自定义的版本...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Placement new的用法及用途
举报原因:
原因补充:

(最多只允许输入30个字)