1.上下文(context)
2. 全局域內的函數聲明將引入全局函數(global function)
3.全局域內的變量將引入全局對象(global object)
4.生命期(lifetime)
5.函數聲明(declaration) 指定了該函數的名字以及函數的返回類型和參數列表
6.函數定義(definition)還為函數提供了函數體
7.extern為聲明但不定義一個對象提供了一種方法. --承諾了該對象會在其他地方被定義
extern 聲明不會引起內存被分配
8.c++中有一種機制, 通過它可以把函數參數的類型和數目編碼在函數名中, 改機制叫做類型安全鏈接(type-safe-linkage)
9.不同文件中出現同一對象或函數聲明的其他類型不匹配情況, 在編譯或鏈接時可能不會被捕捉到, 因為編譯器一次只能處理一個文件, 他不能很容易地檢
查到文件之間的類型違例, 這些類型違例可能是程序嚴重錯誤的根源
10.頭文件為所向extern對象聲明, 函數聲明以及inline函數定義提供了一個集中的位置: 這被稱作聲明的局部化(localization)
11.頭文件提供了兩個安全保證
保證所有文件都包含同一個全局對象或函數的同一份聲明
如果需要修改聲明, 則只需要改變一個頭文件
--只在本cpp用的全局函數, 該不該定義在頭文件里面?
12.局部對象(local object)
自動對象(automatic object) --程序運行棧
寄存器對象(register object) --如果所選擇的變量被頻繁使用, 則寄存器變量可以提高函數的執行速度
局部靜態對象(local static object)
13.當一個自動變量的地址唄存儲在一個生命期長與它的指針時, 該指針被稱為空懸指針(dangling pointer)
14.動態分配的對象被分配在程序的空閑存儲區(free store)的可用內存池中
15.new表達式失敗時, 通常會拋出bad_alloc異常
16.應用delete表達式失敗, 使內存無法返回空閑存儲區, 稱作內存泄露(memory leak)
17.對用一內存應用了兩次delete表達式, 通常發生在兩個指針指向同一個動態分配對象的時候, 這是一個很難跟蹤的問題
18.在對象被釋放后讀寫該對象, 這常常會發生, 因為delete表達式應用的指針沒有被設置為0
19.為幫助程序員更好地管理動態分配的內存, c++庫提供了auto_ptr類類型的支持 --智能指針
20.auto_ptr類模板頭文件<memory>
auto_ptr<int>pi(new int(1024));
//pi是局部智能指針, 當pi生命期結束時候, 會自動釋放pi指向的堆空間
為了判斷auto_ptr對象是否指向了一個對象, 可以用操作get()返回auto_ptr對象內部的底層指針
if(p_auto_int.get() != 0 && *p_auto_int != 1024) { ... }
21.在某些情況下, 小細節會積聚成可怕的性能瓶頸, 這些細節不應該煩擾那些試圖為整個程序提供解決方案的人, 但是這些細節是有經驗的程序員應該考慮
的
22.定位new表達式
new表達式可以允許程序員要求將對象創建在已經被分配好的內存中, 這種形式的new表達式被稱為定位new表達式(placement new expression)
new (place_address) type -specifier
place_address必須是個指針
頭文件<new>
byte *mem = new byte[4096]; //這個是自定義內存池?
char *tmp = new(mem) char; //在內存池分配一個char來用?
delete [] mem;