当有一些已经被分配但是尚未处理的(raw)内存,可以在这些内存中构造
一个对象。使用的是一个特殊的 operator new,它被称为 placement new。
使用 place new 的例子,
class Widget
{
public:
Widget(int widgetSize);
...
};
Widget *constructWidgetInBuffer(void *buffer, int widgetSize)
{
return new (buffer) Widget(widgetSize);
}
当程序使用共享内存或 memory-mapped I/O 时这个函数可能有用,因为
在这样的程序里对象必须被放置在一个确定地址上或一块被例程分配的
内存里。
返回的表达式是,
new (buffer) Widget(widgetSize)
它是 new 操作符的一个用法,需要使用一个额外的变量(buffer),
当 new 操作符隐含调用 operator new 函数时,把这个变量传递给它。被调用的
operator new 函数除了带有强制的参数 size_t 外,还必须接受 void* 指针参数,
指向构造对象占用的内存空间。 这个 operator new 就是 placement new, 它看
上去象这样,
void * operator new(size_t, void * location)
{
return location;
}
这可能显得有些简单,这是这就是 placement new 需要做的事情。毕竟 operator new
的目的是为对象分配内存然后返回指向该内存的指针。