1. 程式人生 > >動態記憶體管理

動態記憶體管理

  1. 動態記憶體支援程式設計師建立和使用種種能夠根據具體需要擴大和縮小的資料結構,它們只受限於計算機的硬體記憶體總量和系統特殊約束。
  2. 靜態記憶體就是之前一直使用的東西:變數(包括指標變數)、固定長度的陣列、某給定類的物件。我們可以在程式程式碼裡通過它們的名字或者地址來訪問和使用它們。
  3. 使用靜態記憶體的最大弊端是,我們不得不在編寫程式時為有關變數分配一塊儘可能大的記憶體(以防不夠存放資料)。一旦程式開始執行,不管實際情況如何,那個變數都將佔用那麼多的記憶體,沒有任何辦法能夠改變靜態記憶體的大小。
  4. 動態記憶體由一些沒有名字、只有地址的記憶體塊構成,那些記憶體塊是在程式執行期間動態分配的。它們來自一個由標準c++庫替你管理的“大池子”(記憶體池)。
  5. 從記憶體池申請一些記憶體需要用new語句,它將根據你提供的資料型別分配一塊大小適當的記憶體。你不必擔心記憶體塊的尺寸問題,編譯器能夠記住每一種資料型別的單位長度並迅速計算出需要分配多少個位元組。
  6. 如果有足夠的可用記憶體能滿足你的申請,new語句將返回新分配地址塊的起始地址。如果沒有足夠的可用記憶體空間,那麼new語句將丟擲std::bad_alloc異常。
  7. 注意在用完記憶體塊之後,應該用delete語句把它還給記憶體池。另外作為一種附加的保險措施,在釋放了記憶體塊之後還應該把與之關聯的指標設定為NULL。
  8. 有一個特殊的地址值叫做NULL指標。當把一個指標變數設定為NULL時,它的含義是那個指標將不再指向任何東西。我們無法通過一個被設定為NULL的指標去訪問資料。事實上,試圖對一個NULL指標進行解引用將在執行時被檢測到並將導致程式中止執行。所以在用delete釋放記憶體後,指標會保留一個毫無意義的地址,我們要將指標變數賦值為NULL。
  9. New語句返回的記憶體塊很可能充滿“垃圾”資料,所以我們通常先往裡邊寫一些東西覆蓋,再訪問它們,或者在類直接寫一個構造器來初始化。
  10. 在使用動態記憶體時,最重要的原則是每一條new語句都必須有一條與之配對的delete語句,沒有配對的delete語句或者有兩個配對的delete語句都屬於程式設計漏洞。
  11. 在重新使用某個指標之前千萬不要忘記呼叫delete語句,如果不這樣做,那個指標將得到一個新記憶體塊的地址,而程式將永遠也無法釋放原先那個記憶體塊,因為它的地址已經被覆蓋掉了。
  12. Delete語句只釋放給定指標變數正指向的記憶體塊,不影響這個指標。在執行delete語句之後,那個記憶體塊被釋放掉了,但指標變數依然存在。
  13. 因為用來儲存陣列地址的變數只是一個簡單的指標,所以需要明確地告訴編譯器它應該刪除一個數組。具體的做法是在delete保留字的後面加上一對方括號:delete []x;