C++ 指標
簡單記錄下平時的學習中涉及到指標的注意點,其中有轉別人的內容,自己再慢慢添加總結。
轉:http://blog.pfan.cn/colormoon/19260.html
1.指標是儲存記憶體位址的變數。
int *pAge=0;
值為零的指標被稱為空白指標。所有指標在定義時都應該被初始化。沒有初始化的指標稱為失控指標。
int age=50;
pAge=&age;
以上是為指標賦值的完整過程。
2.對於變數,類型會告訴編譯器需要多少儲存空間去裝載。但對於指標,類型並不這樣做,所有指標均是4個位元組。
3.使用間接引用運算子(*)來引用指標。當一個指標被間接引用時,就讀取其所儲存的地址處的值。
4.指標有以下三種用途:
i.處理自由儲存區的資料;
ii.訪問類的成員資料和函數;
iii.通過引用的方式向函數傳遞變數。
5.局部變數和函數形參位於棧中,寄存器則用於記憶體管理(如儲存棧頂指標和指令指標),代碼區位於代碼區,全域變數區,其餘的記憶體空間作為自由儲存區,稱為堆。
棧在函數返回時會自動清除。自由儲存區在程式結束之前不會自動清除,所以在佔用之後必須主動釋放。
6.C++中使用關鍵字new來分配自由儲存區中的記憶體。new的傳回值是記憶體的地址,它必須被賦給一個指標。如:
unsigned short *pPointer=new unsigned short;
當不在使用一塊記憶體時,使用關鍵字delete,它的作用是釋放記憶體。
7.記憶體流失。
指標本身是一個局部變數,當聲明指標的函數返回時,指標的範圍也就結束了,因此被丟棄了。然而由new申請的記憶體不會自動釋放,於是這塊記憶體就不能被其他資料使用,這種情況就稱為“記憶體流失”。因此要記得使用delete來釋放記憶體。釋放後最好將指標賦值為0,變為空白指標。
另一種造成記憶體流失的情況是:在沒有刪除一個指標之前就對其重新賦值。如:
unsigned short int *pPointer=new unsigned short int;
*pPointer=72;
pPointer=new unsigned short int;
pPonter=84;
這時儲存72的記憶體空間變得不可用,也沒辦法再去釋放它。應該是再次使用時,先釋放。
8.也可以在自由儲存區內為類的對象分配記憶體。如:
Cat *pCat=new Cat;
這條語句調用了預設建構函式(無參數的建構函式)。刪除這類指標時,在記憶體釋放之前會調用對象的解構函式。
也就是說,記憶體配置是在類對象的建構函式中進行的,而記憶體刪除則是在類對象的解構函式中進行的。
9.每個類的成員都有一個隱藏的指標:this指標。該指標指向每一個單獨的對象,它儲存了對象的地址。
10.迷途指標(或稱失控指標、懸浮指標):指對一個指標調用delete時(這樣會釋放它的記憶體)卻並沒有把它設定為空白時產生的。若此時並沒有重新賦值就試圖再次調用它時,就會引起不可預料的結果。
好的解決辦法是在刪除一個指標後,把它設定為空白指標(0)。
11.在指標的類型之前和之後可以使用關鍵字const,也可以在這兩個位置上同時使用。
const int *pOne;
int * const pTwo;
const int * const pThree;
pOne是一個指向整型常量的指標,該指標指向的值是不能被改變的。
pTwo也是一個指向整型的常指標,它指向的整數可以改變,但這個指標不能指向其他變數。
pThree是一個指向整型常量的指標,它指向的值不能被改變,也不能指向其他變數。
保持正確的竅門是觀察關鍵字的右邊是什麼,如果是類型,那麼值就是常量,如果是變數名,那麼指標變數本身就是常量。
12.一個指標可以與另一個指標相減。
13.對記憶體操作的考查主要集中在:
(1)指標的理解;
(2)變數的生存期及作用範圍;
(3)良好的動態記憶體申請和釋放習慣。
14 0xC0000005: Access Violation
記憶體訪問錯誤。應該是訪問了不該訪問的地方,可能是使用“野指標”訪問造成的。比如訪問一個已經釋放了堆空間,或者退出函數後使用指向堆棧空間中變數的指標,聲明了一個指標變數,然後沒有new就進行使用。這種致命的問題一定要仔細解決徹底,不留後患。