我們平時使用的 new,其實是 new operator(new 操作符),這個操作符是由語言內建的,就是 sizeof那樣,不能被改變意義。
new operator完成兩件事情:
1.分配足夠的內存;
2.調用一個 constructor,為剛剛分配的內存中的那個對象設定初始值。
如果你希望對象產生於 heap,就調用我們平時使用的 new operator(new操作符),它不但分配內存並且為該對象調用一個構造函數;
如果你只打算分配內存,請調用 operator new,這樣和調用 malloc差不多,只會分配內存,不會調用構造函數;
如果你打算在 heap objects產生時自己決定內存的分配方式,就自己寫一個 operator new,並使用 new operator(首先調用你自己寫的 operator new,然後調用構造函數);
如果你打算在已分配(並擁有指針的情況下)的內存中構造對象,請使用 placement new。
知識點1:
我們平時所使用的 new操作符,它實際上做了兩件事情:
1.調用名為 operator new的標準庫函數,分配足夠大的原始化的內存;
2.運行該類型的構造函數,用於初始化該對象,並返回該對象。
我們平時使用的 delete操作符,它實際上也做了兩件事情:
1.對所指對象調用適當的 析構函數;
2.調用名為 operator delete的標準庫函數,釋放該對象所佔內存。
所以說,我們可以重載的是 申請、釋放內存的兩個函數,就是 operator new/delete,不能重載的是 new/delete operator(這是操作符)。
知識點2:
Placement new。主要用於在 我們指定的內存地址上進行類的構造函數的調用。這個在 shared memory或者 memory-mapped I/O中可能會用到,因為可以指定地址。
用法:
new (place_address) type; //place_address必須是一個指針
new (place_address) type(initializer-list); //initializer提供了初始化列
具體用法:
class Widget {
Public:
Widget(int nWidgetSize);
...
};
Widget *ConstructWidgetInBuffer(void *pBuffer, int nWidgetSize) {
return new (pBuffer) Widget(nWidgetSize); //Placement new用法
}
知識點3:
當然你也可以重載 operator new[],這意味著你奪取了數組內存的分配權。