C++ 深刻new

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相似。
相關文章
相關標籤/搜索