placement new的作用就是:创建对象(调用该类的构造函数)但是不分配内存,而是在已有的内存块上面创建对象。用于需要反复创建并删除的对象上,可以降低分配释放内存的性能消耗。
#include <new> 定义头文件;
placement new。和其他普通的new不同的是,它在括号里多了另外一个参数。比如:
Widget * p = new Widget; //ordinary new 普通的
pi = new (ptr) int; //placement new , ptr指向已分配好的一块内存
使用方法
在很多情况下,placement new的使用方法和其他普通的new有所不同。这里提供了它的使用步骤。
第一步 缓存提前分配
为了保证通过placement new使用的缓存区的memory alignmen(内存队列)正确准备,使用普通的new来分配它:
class Task ;
char * buff = new [sizeof(Task)]; //分配内存
(请注意auto或者static内存并非都正确地为每一个对象类型排列,所以,不能以placement new使用它们。)
第二步:对象的分配
在刚才已分配的缓存区调用placement new来构造一个对象。
Task *ptask = new(buff) Task
第三步:使用
按照普通方式使用分配的对象:
ptask->suspend();
ptask->resume();
第四步:对象的销毁
一旦使用完这个对象,必须调用它的析构函数来毁灭它。按照下面的方式调用析构函数:
ptask->~Task(); //调用外在的析构函数
第五步:释放
可以反复利用缓存并给它分配一个新的对象(重复步骤2,3,4)如果不打算再次使用这个缓存,可以象这样释放它:
delete [] buff;
跳过任何步骤就可能导致运行时间的崩溃,内存泄露,以及其它的意想不到的情况。如果确实需要使用placement new,请认真遵循以上的步骤。