1,C++ new首先做爲運算符和關鍵字使用,相似sizeof,能夠認爲是編譯器內置的,不能改變其行爲,例如:函數
A *a=new A;int *i=new int;
對普通類型而言,只是分配空間。而對類類型,不只分配空間,還調用類的構造函數,例如:翻譯
Class *pc = new Class;delete pc;
編譯器翻譯爲指針
void *p = operator new(sizeof(Class)); // 對p指向的內存調用Class的構造函數,此處沒法用直觀的代碼展示 Class *pc = static_cast<Class*>(p); // ... pc->~Class(); operator delete(pc);
若是類A重載了new成員函數,使用new關鍵字的時候直接調用類A的new函數。不然,使用全局new,類中new的重載僅僅影響重載類的內存分配策略。code
2,全局new函數,和全局operator+() 同樣,只不過是普通的函數,是能夠重載的,重載後會影響全部對象的分配策略。對象
::operator new(size_t size) throw(bad_alloc);
使用new關鍵字的時候,首先調用全局::operator new分配空間大小 ,若是分配失敗調用用戶指定的失敗處理函數,不然拋出bad_alloc。內存
void * operator new(std::size_t size) throw(std::bad_alloc) { if (size == 0) size = 1; void* p; while ((p = ::malloc(size)) == 0) { std::new_handler nh = std::get_new_handler(); if (nh) nh(); else throw std::bad_alloc(); } return p; }
3,placement newget
placement new ,便是一個全局 operator new 的重載版本。對象指針指向的空間不限於堆空間,也能夠指向棧上,以此來實現本身的內存池。編譯器
inline void* operator new (std::size_t, void* __p) {return __p;}
能夠看到, placement new 除了正常的size參數外,還多了一個空指針參數,並且,它也沒幹什麼內存分配的活,而是直接返回了這個指針。使用以下:編譯
void *buf =; // 在這裏爲buf分配內存 Class *pc = new (buf) Class(); 4,::operator new []、類的new[]重載和使用與new相似。