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非常适合那些对时间要求比较高,长时间运行不希望被打断的应用程序。
但也很容易造成内存泄漏的情况!所以要注意在不需要内存缓冲区时,要即时释放内存空间!
别让别人来告诉你,你成不了才,如果你有梦想的话,就要去捍卫它---当幸福来敲门