Placement new

new 操作一般可以分为两个过程:1为申请内存空间 2为调用类型的构造函数进行构造

placement new 调用类型的构造函数对已存在的内存进行构造

 1 #include<new.h>
 2 
 3 class T
 4 {
 5 public:
 6     T(){};
 7     T(int val)
 8     {
 9         this->a=val;
10     }
11     ~T()
12     {
13     }
14     int a;
15 };
16 
17 template <class T1,class T2>
18 inline void construct(T1 *p,const T2 &value)
19 {
20     new (p) T1(value);
21 }
22 
23 template <class T>
24 inline void destory(T* pointer)
25 {
26     pointer->~T();
27 }
28 
29 
30 #include "MEMORY.h"
31 int main()
32 {
33     T *p=new T();
34     int val=2;
35     construct(p,val);
36     destory(p);
37     delete p;
38 }

使用new操作符分配内存需要在堆中查找足够大的剩余空间,显然这个操作速度是很慢的,而且有可能出现无法分配内存的异常(空间不够)。 
placement new 就可以解决这个问题。我们构造对象都是在一个预先准备好了的内存缓冲区中进行,不需要查找内存,内存分配的时间是常数;而且不会出现在程序运行中途出现内 存不足的异常。所以,placement new非常适合那些对时间要求比较高,长时间运行不希望被打断的应用程序。

但也很容易造成内存泄漏的情况!所以要注意在不需要内存缓冲区时,要即时释放内存空间!

posted @ 2013-06-04 18:06  宁静致远--Ada  阅读(326)  评论(0编辑  收藏  举报