Widget * p = new Widget; //普通的new pi = new (ptr) int; //placement new
括号里的参数是一个指针,它指向一个内存缓冲器,placement new将在这个缓冲器上分配一个对象。Placement new的返回值是这个被构造对象的地址。在对时间要求非常高的应用程序中,placement new是非常有用的,因为这些程序分配的时间是确定的,它们必须长时间的运行并要进行垃圾回收。
在一些时候placement new的使用方法和其他普通的new不同。这里提供了它的使用方法。
确定被placement new使用的缓存区的内存队列已经准备好,使用普通的new来分配它:
class Task ;
char * buff = new [sizeof(Task)]; //分配内存
在刚才已分配的缓存区调用placement new来构造一个对象。
Task *ptask = new(buff) Task
按照普通方式利用分配的对象:
ptask->suspend();
ptask->resume();
//...
一旦你使用完这个对象,你必须调用它的析构函数来毁灭它。按照下面的方式调用析构函数:
ptask->~Task(); //调用外在的析构函数
你可以反复利用缓存并给它分配一个新的对象(重复步骤2,3,4)如果你不打算再度使用这个缓存,你可以象这样释放它:
delete [] buff;
如果跳过任何步骤就可能导致运行时间的崩溃,内存不够,以及其他的意想不到的状况。如果你需要使用placement new,请按照上面步骤一步步的执行。
本文作者Danny Kalev 是一个系统分析家、软件工程师,在C++和面向对象设计方面有着14年的专业经验。