operator new和operator delete學(xué)習(xí)總結(jié)
這塊內(nèi)容很多很多,那就撿幾個(gè)重要的地方說說吧,主要目的是為了在遺忘的時(shí)候給自己提個(gè)醒,呵呵。
1。new和delete的重載函數(shù)都是static函數(shù),你可以在聲明的時(shí)候?qū)懮先ィ部梢圆粚懀ň幾g器自動(dòng)為你添加),但是事實(shí)是無法更改的,它們都是static的。
2。new和delete必須形式上配對(duì),且里面做的內(nèi)容也要配對(duì)
void* operator new(size_t size, const char*, int);//調(diào)用形式為new("wokao",34) ;
void operator delete(void *p, const char*, int);//這個(gè)delete與上面的那個(gè)new配對(duì)
void operator delete(void *p, size_t, const char*, int)//這個(gè)delete與上面的那個(gè)new不配對(duì)
3。new和delete的標(biāo)準(zhǔn)形式是:
void* operator new(size_t size);
void operator delete(void* p);
或void operator delete(void* p,size_t size);//這個(gè)delete可以驗(yàn)證if( sizeof(X)!=size )
4。new可以被重載出其他的樣式來;而delete重載時(shí),如果有其他樣式出現(xiàn),那是為了配合new的新樣式,與此同時(shí)也必須得有標(biāo)準(zhǔn)的delete樣式,因?yàn)槲覀冏詈骴elete *p的時(shí)候調(diào)用的是標(biāo)準(zhǔn)的delete樣式,而那個(gè)非標(biāo)準(zhǔn)的只是為了在構(gòu)造函數(shù)拋出異常時(shí)讓系統(tǒng)調(diào)用與新樣式的new配套的新樣式的delete。
5。只有基類的析構(gòu)函數(shù)被聲明為virtual時(shí)(如果你沒有在基類中寫析構(gòu)函數(shù)而是利用默認(rèn)的或者即便寫了卻忘了加virtual都是不可以的),才可以通過基類的指針(實(shí)則指向子類)來delete,達(dá)到調(diào)用子類delete的目的。
6。不論你重載不重載,本質(zhì)上new都是調(diào)用::operator new(size)這個(gè)全局函數(shù)來分配恰當(dāng)?shù)膬?nèi)存空間,可以在調(diào)用new之前通過set_new_handler函數(shù)來設(shè)置配置內(nèi)存失敗的回調(diào)函數(shù)。
7。new重載函數(shù)中的size至少是1,即便類沒有任何成員變量。
8。new的順序:new->基類的構(gòu)造函數(shù)(在進(jìn)入基類構(gòu)造函數(shù)之前當(dāng)然需要先根據(jù)初始化列表來初始化基類的部分成員變量)->子類的構(gòu)造函數(shù)(在進(jìn)入基類構(gòu)造函數(shù)之前當(dāng)然需要先根據(jù)初始化列表來初始化基類的部分成員變量)
9。delete的順序:子類的析構(gòu)函數(shù)->基類的析構(gòu)函數(shù)->delete
10。重載new運(yùn)算符時(shí)最好要讓標(biāo)準(zhǔn)的new的調(diào)用形式露出來
void* operator new(size_t size,char*);void* operator new(size_t size);
或void* operator new(size_t size,char* =NULL);
11。寫一個(gè)new,就最好寫一個(gè)與之配套的delete。
12。對(duì)于new[]和delete[]的重載,也完全沒啥區(qū)別,就是換了個(gè)名稱,除此之外,再無其他特別之處了。