模板是比較高級(jí)的C++編程技巧,模板特化、模板偏特化就更是技巧性很強(qiáng)的東 西,STL中的type_traits充分借助模板特化的功能,實(shí)現(xiàn)了在程序編譯期通過編譯器來決定為每一處調(diào)用使用哪個(gè)特化版本,于是在不增加編程復(fù)雜 性的前提下大大提高了程序的運(yùn)行效率。更詳細(xì)的內(nèi)容可參考《STL源碼剖析》第二、三章中的相關(guān)內(nèi)容。
帶有“[]”的new和delete
我們經(jīng)常會(huì)通過new來動(dòng)態(tài)創(chuàng)建一個(gè)數(shù)組,例如:
char* s = new char[100];
……
delete s;
嚴(yán)格的說,上述代碼是不正確的,因?yàn)槲覀冊(cè)诜峙鋬?nèi)存時(shí)使用的是new[],而并不是簡(jiǎn)單的new,但釋放內(nèi)存時(shí)卻用的是delete。正確的寫法是使用delete[]:
delete[] s;
但是,上述錯(cuò)誤的代碼似乎也能編譯執(zhí)行,并不會(huì)帶來什么錯(cuò)誤。事實(shí)上,new與new[]、delete與delete[]是有區(qū)別的,特別是當(dāng)用來操作復(fù)雜類型時(shí)。假如針對(duì)一個(gè)我們自定義的類MyClass使用new[]:
MyClass* p = new MyClass[10];
上述代碼的結(jié)果是在堆上分配了10個(gè)連續(xù)的MyClass實(shí)例,并且已經(jīng)對(duì)它們依次調(diào) 用了構(gòu)造函數(shù),于是我們得到了10個(gè)可用的對(duì)象,這一點(diǎn)與Java、C#有區(qū)別的,Java、C#中這樣的結(jié)果只是得到了10個(gè)null。換句話說,使用 這種寫法時(shí)MyClass必須擁有不帶參數(shù)的構(gòu)造函數(shù),否則會(huì)發(fā)現(xiàn)編譯期錯(cuò)誤,因?yàn)榫幾g器無法調(diào)用有參數(shù)的構(gòu)造函數(shù)。
當(dāng)這樣構(gòu)造成功后,我們可以再將其釋放,釋放時(shí)使用delete[]:
delete[] p;
當(dāng)我們對(duì)動(dòng)態(tài)分配的數(shù)組調(diào)用delete[]時(shí),其行為根據(jù)所申請(qǐng)的變量類型會(huì)有所不 同。如果p指向簡(jiǎn)單類型,如int、char等,其結(jié)果只不過是這塊內(nèi)存被回收,此時(shí)使用delete[]與delete沒有區(qū)別,但如果p指向的是復(fù)雜 類型,delete[]會(huì)針對(duì)動(dòng)態(tài)分配得到的每個(gè)對(duì)象調(diào)用析構(gòu)函數(shù),然后再釋放內(nèi)存。因此,如果我們對(duì)上述分配得到的p指針直接使用delete來回收, 雖然編譯期不報(bào)什么錯(cuò)誤(因?yàn)榫幾g器根本看不出來這個(gè)指針p是如何分配的),但在運(yùn)行時(shí)(DEBUG情況下)會(huì)給出一個(gè)Debug assertion failed提示。
到這里,我們很容易提出一個(gè)問題--delete[]是如何知道要為多少個(gè)對(duì)象調(diào)用析構(gòu)函數(shù)的?要回答這個(gè)問題,我們可以首先看一看new[]的重載。
class MyClass
{
int a;
public:
MyClass() { printf("ctorn"); }
~MyClass() { printf("dtorn"); }
};
void* operator new[](size_t size)
{
void* p = operator new(size);
printf("calling new[] with size=%d address=%pn", size, p);
return p;
}
// 主函數(shù)
MyClass* mc = new MyClass[3];
printf("address of mc=%pn", mc);
delete[] mc;
運(yùn)行此段代碼,得到的結(jié)果為:(VC2005)
calling new[] with size=16 address=003A5A58
ctor
ctor
ctor
address of mc=003A5A5C
dtor
dtor
dtor
相關(guān)推薦:計(jì)算機(jī)等級(jí)考試二級(jí):C++學(xué)習(xí)重點(diǎn)分析試題北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |