用法以及編譯器解釋
placement new 允許我們將object構建于已經分配的內存上。(所以此時必須有個指針指向已經分配好的內存)
沒有所謂的placement delete ,因為placement new根本沒有分配內存.
也有種說法,是將placement new對應的內存釋放掉的操作為placement delete。
char* buf = new char[sizeof(Complex)*3];
Complex* pc = new(buf)Complex(1,2); //將對象分配在已經分配好的內存buf上
...
delete [] buf;
被編譯器轉為:
Complex *pc;
try{1、void mem = operator new(sizeof(Complex),buf); //在頂點內存2、pc = static_cast<Complex*>(mem); //轉型3、pc->Complex::Complex(1,2); //調用構造函數
}
catch(std::bad_alloc){//若allocation失敗就不執行構造函數
}
pc、buf指向同一個地方。
關于operator new,此處用的函數與之前提到的函數有點不一樣:https://blog.csdn.net/qq_42604176/article/details/111638568
這里的用法為:
你傳遞分配好的內存給它,它什么都沒做,將地址返回。
于是我們可以總結,placement new就是調用了構造函數。
注意,這三種寫法是一致的: