首頁 考試吧論壇 Exam8視線 考試商城 網(wǎng)絡(luò)課程 模擬考試 考友錄 實(shí)用文檔 求職招聘 論文下載
2011中考 | 2011高考 | 2012考研 | 考研培訓(xùn) | 在職研 | 自學(xué)考試 | 成人高考 | 法律碩士 | MBA考試
MPA考試 | 中科院
四六級(jí) | 職稱英語 | 商務(wù)英語 | 公共英語 | 托福 | 雅思 | 專四專八 | 口譯筆譯 | 博思 | GRE GMAT
新概念英語 | 成人英語三級(jí) | 申碩英語 | 攻碩英語 | 職稱日語 | 日語學(xué)習(xí) | 法語 | 德語 | 韓語
計(jì)算機(jī)等級(jí)考試 | 軟件水平考試 | 職稱計(jì)算機(jī) | 微軟認(rèn)證 | 思科認(rèn)證 | Oracle認(rèn)證 | Linux認(rèn)證
華為認(rèn)證 | Java認(rèn)證
公務(wù)員 | 報(bào)關(guān)員 | 銀行從業(yè)資格 | 證券從業(yè)資格 | 期貨從業(yè)資格 | 司法考試 | 法律顧問 | 導(dǎo)游資格
報(bào)檢員 | 教師資格 | 社會(huì)工作者 | 外銷員 | 國(guó)際商務(wù)師 | 跟單員 | 單證員 | 物流師 | 價(jià)格鑒證師
人力資源 | 管理咨詢師考試 | 秘書資格 | 心理咨詢師考試 | 出版專業(yè)資格 | 廣告師職業(yè)水平
駕駛員 | 網(wǎng)絡(luò)編輯
衛(wèi)生資格 | 執(zhí)業(yè)醫(yī)師 | 執(zhí)業(yè)藥師 | 執(zhí)業(yè)護(hù)士
會(huì)計(jì)從業(yè)資格考試會(huì)計(jì)證) | 經(jīng)濟(jì)師 | 會(huì)計(jì)職稱 | 注冊(cè)會(huì)計(jì)師 | 審計(jì)師 | 注冊(cè)稅務(wù)師
注冊(cè)資產(chǎn)評(píng)估師 | 高級(jí)會(huì)計(jì)師 | ACCA | 統(tǒng)計(jì)師 | 精算師 | 理財(cái)規(guī)劃師 | 國(guó)際內(nèi)審師
一級(jí)建造師 | 二級(jí)建造師 | 造價(jià)工程師 | 造價(jià)員 | 咨詢工程師 | 監(jiān)理工程師 | 安全工程師
質(zhì)量工程師 | 物業(yè)管理師 | 招標(biāo)師 | 結(jié)構(gòu)工程師 | 建筑師 | 房地產(chǎn)估價(jià)師 | 土地估價(jià)師 | 巖土師
設(shè)備監(jiān)理師 | 房地產(chǎn)經(jīng)紀(jì)人 | 投資項(xiàng)目管理師 | 土地登記代理人 | 環(huán)境影響評(píng)價(jià)師 | 環(huán)保工程師
城市規(guī)劃師 | 公路監(jiān)理師 | 公路造價(jià)師 | 安全評(píng)價(jià)師 | 電氣工程師 | 注冊(cè)測(cè)繪師 | 注冊(cè)計(jì)量師
繽紛校園 | 實(shí)用文檔 | 英語學(xué)習(xí) | 作文大全 | 求職招聘 | 論文下載 | 訪談 | 游戲

計(jì)算機(jī)等級(jí)考試二級(jí)C++復(fù)習(xí)指導(dǎo):深入new

計(jì)算機(jī)等級(jí)考試二級(jí)C++復(fù)習(xí)指導(dǎo):深入new

  模板是比較高級(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

上一頁  1 2 3 4 5 6 7 8 9 10 下一頁
  相關(guān)推薦:計(jì)算機(jī)等級(jí)考試二級(jí):C++學(xué)習(xí)重點(diǎn)分析試題
       2010年全國(guó)計(jì)算機(jī)等級(jí)考試全攻略(一至四級(jí))
       2010年計(jì)算機(jī)等級(jí)考試二級(jí)公共基礎(chǔ)知識(shí)教程
文章搜索
版權(quán)聲明:如果計(jì)算機(jī)等級(jí)考試網(wǎng)所轉(zhuǎn)載內(nèi)容不慎侵犯了您的權(quán)益,請(qǐng)與我們聯(lián)系800@exam8.com,我們將會(huì)及時(shí)處理。如轉(zhuǎn)載本計(jì)算機(jī)等級(jí)考試網(wǎng)內(nèi)容,請(qǐng)注明出處。