有時你確實想直接調用構造函數。在一個已存在的對象上調用構造函數是沒有意義的,因為構造函數用來初始化對象,而一個對象僅僅能在給它初值時被初始化一次。但是有時你有一些已經被分配但是尚未處理的的(raw)內存,你需要在這些內存中構造一個對象。你可以使用一個非凡的operator new ,它被稱為placement new。
下面的例子是placement new如何使用,考慮一下:
class Widget { public: Widget(int widgetSize); ... };
Widget * constrUCtWidgetInBuffer(void *buffer,
int widgetSize) { return new (buffer) Widget(widgetSize); } 這個函數返回一個指針,指向一個Widget對象,對象在轉遞給函數的buffer里分配。當程序使用共享內存或memory-mapped I/O時這個函數可能有用,因為在這樣程序里對象必須被放置在一個確定地址上或一塊被例程分配的內存里。(參見條款4,一個如何使用placement new的一個不同例子。)
string *ps = new string[10]; // allocate an array of // objects 被使用的new仍然是new操作符,但是建立數組時new操作符的行為與單個對象建立有少許不同。第一是內存不再用operator new分配,代替以等同的數組分配函數,叫做operator new[](經常被稱為array new)。它與operator new一樣能被重載。這就答應你控制數組的內存分配,就象你能控制單個對象內存分配一樣(但是有一些限制性說明,參見Effective C++ 條款8)。
new和delete操作符是內置的,其行為不受你的控制,凡是它們調用的內存分配和釋放函數則可以控制。當你想定制new和delete操作符的行為時,請記住你不能真的做到這一點。你只能改變它們為完成它們的功能所采取的方法,而它們所完成的功能則被語言固定下來,不能改變。(You can modify how they do what they do, but what they do is fixed by the language)