在写服务器程序的时候,经常会用到内存池,很多是在堆(heap)上预分配一大块内存,用空闲链表的方式来实现内存的分配与回收。
在业务应用的时候,如果想用这预分配的内存来创建对象,就不能用通常的new了,而需要用到placement new构造,它可以构造对象到给出的内存上。
placement new的原型如下:
void *operator new( size_t, void *p ) throw() { return p; }大概的使用流程类似下面的步骤:
class A
{
……
};
void* mem = pMemPoll->alloc(); //从内存池预分配的内存
A* a = new(mem)A;
……
a->~A(); //注意,对象回收时,需要显式调用析构函数
参考:
http://www.cppblog.com/michaelgao/archive/2009/01/08/71527.html
http://www.cppblog.com/michaelgao/archive/2009/01/08/71527.html