C++ 中的內(nèi)存區(qū)域分為6塊:
- 常量數(shù)據(jù)區(qū):存儲(chǔ)字符串等在編譯期間就能確定的值。類對(duì)象不能存在與這個(gè)區(qū)域中。在程序的整個(gè)生存周期內(nèi),區(qū)域中的數(shù)據(jù)都是可用的。區(qū)域內(nèi)的所有數(shù)據(jù)都是只讀的,任何企圖修改本區(qū)域數(shù)據(jù)的行為都會(huì)造成無法預(yù)料的后果。
- 棧區(qū):存儲(chǔ)自動(dòng)變量。棧區(qū)中,內(nèi)存一旦被分配,對(duì)象就立即被構(gòu)造好了;對(duì)象一旦被銷毀,分配的內(nèi)存也立即被收回。
- 自由存儲(chǔ)區(qū):是 C++ 的兩個(gè)動(dòng)態(tài)內(nèi)存區(qū)域之一,使用 new 和 delete 來予以分配和釋放。
- 堆區(qū):是另一個(gè)動(dòng)態(tài)存儲(chǔ)區(qū)域,使用 malloc、free 以及一些相關(guān)變量來進(jìn)行分配和回收。
- 全局/靜態(tài)區(qū):在程序啟動(dòng)時(shí)才被分配,而且可能直到程序開始執(zhí)行的時(shí)候才被初始化。比如,函數(shù)中的靜態(tài)變量就是在程序第一次執(zhí)行到定義該變量的代碼時(shí)才被初始化的。對(duì)那些跨越了編譯單元的全局變量進(jìn)行初始化操作的順序是沒有被明確定義的,因而需要特別注意管理全局對(duì)象(包括靜態(tài)類對(duì)象)之間的依賴關(guān)系。
另外注意,C++ 標(biāo)準(zhǔn)對(duì)于堆和自由存儲(chǔ)區(qū)是否有聯(lián)系沒有予以詳細(xì)說明,不同編譯器可能有不同的實(shí)現(xiàn)。
文章來源:
http://my.donews.com/robinchow/2007/01/14/kvdartgbqpsrlrmsxjgnplhdrqqyqtkapnag/
使用 auto_ptr(靈巧指針)的注意事項(xiàng):
- 對(duì)于 auto_ptr,拷貝不是對(duì)等的。右側(cè)的對(duì)象不再擁有對(duì)象的所有權(quán)。
- 不再擁有所有權(quán)的 auto_ptr 的指針會(huì)被置為 NULL,因而對(duì)它的解引用會(huì)導(dǎo)致錯(cuò)誤。
- 使用 const auto_ptr 可以防止將該靈巧指針賦值給其他靈巧指針。
文章來源:
http://my.donews.com/robinchow/2007/01/14/xzuxgvbkpleammqcmlzlsjhkcqmgfdpddjaj/
C++ 中 bool 是一個(gè)基本類型,可以通過各種方法來模擬它,但是都存在不同的缺陷:
- 使用 typedef 模擬,bool 不允許重載。
- 使用 #define,bool 不允許重載且通常破壞了 #define。
- enum bool允許重載但在條件表達(dá)式中不能進(jìn)行自動(dòng)類型轉(zhuǎn)換。bool b = (i == j)是錯(cuò)誤的,因?yàn)?int 不能隱含地轉(zhuǎn)換成 enums。
- bool 類允許重載但不能讓 bool 對(duì)象在條件中作測試,除非它能提供自動(dòng)轉(zhuǎn)換到基本類型,但是提供自動(dòng)轉(zhuǎn)換卻通常會(huì)干擾函數(shù)重載解析過程。
文章來源:
http://my.donews.com/robinchow/2007/01/15/bszvusphgepqbphvticopjkpfadfapccibyd/
關(guān)于控制流(即 C++ 代碼的執(zhí)行順序):
- 在各翻譯單元之間的那些全局變量(包括類的靜態(tài)變量)的初始化順序并未被定義。
- 當(dāng)程序在 non-debug 模式下被建立的時(shí)候,編譯器會(huì)自動(dòng)刪掉 assert()。因此不要在 assert 中加入有副作用的代碼。
- 對(duì)于代碼:cout << f(i) << g(i);,f 和 g 的執(zhí)行順序是不確定的,即隨著不同的編譯器實(shí)現(xiàn)而有所不同。
文章來源:
http://my.donews.com/robinchow/2007/01/15/ragovhbegchcbordvelfjrvrdzairpzjpfxl/