跳至內容

C++ 程式設計/記憶體管理技巧

來自華夏公益教科書,開放書籍,開放世界

記憶體分配/釋放

[編輯 | 編輯原始碼]

您可以根據需要分配/釋放每個物件,或者您可以回收您的物件。

分配釋放

[編輯 | 編輯原始碼]

這將是最基本的方法。您可以使用 'new' 運算子分配記憶體。您可以使用 'delete' 運算子釋放記憶體。

此外,C 樣式記憶體管理函式如 malloc、realloc、free 等可用於分配/釋放記憶體。在大多數情況下,最好使用 'new'。

請檢視本文後面的自動指標,以促進自動指標的釋放。

記憶體池

[編輯 | 編輯原始碼]

如果您要反覆分配和釋放,則最好使用記憶體池。

使用記憶體池有幾個優點。

  • 您可以控制要分配的記憶體量。例如,您的記憶體池輔助函式或記憶體池類可以限制要分配的物件的數量。它們可能會在超過限制時返回 NULL。或者,在多執行緒應用程式中,它們可以選擇等待消費者“返回”一些物件。
  • 如果您在一塊記憶體中分配,與逐個分配相比,您可以獲得連續的記憶體。連續記憶體在快取命中方面可能更快。
  • 您可以更好地控制分配和釋放。例如,記憶體池可以跟蹤“借給”其他類的所有記憶體。它可以提供一個功能,透過單個函式呼叫釋放所有記憶體。如果您不想擔心釋放各個物件,而是希望在函式結束時透過一次呼叫釋放所有已使用物件,這將非常有用。
  • 您的記憶體池類可以根據系統的配置動態地執行。例如,在多執行緒的生產者-消費者模型中,您的記憶體池類可以選擇基於系統中的可用記憶體來選擇合適的快取大小。

管理指標

[編輯 | 編輯原始碼]

您需要在 C++ 中管理指標。以下是一些提示

  • 作為一般規則,每個指標都應指向有效的記憶體位置,或者應該是 NULL。您應不惜一切代價避免懸空指標。
  • 儘可能地,您不應該有多個指標指向同一個記憶體。如果使用一個指標釋放記憶體,但沒有將其他指標設定為 NULL,這可能會導致懸空指標。
  • 您應該嘗試在同一個位置建立和銷燬指標。這使得跟蹤您正在分配和釋放的內容變得容易。
  • 切勿雙重釋放指標。並且如果指標已經指向有效的記憶體位置,切勿將指標重新分配到新的記憶體位置,除非您當然有其他方法來釋放舊的記憶體位置。
  • 使用 'new' 或 'malloc' 等分配的每個記憶體位置都應在您完成使用記憶體後釋放。不釋放此記憶體將被稱為記憶體洩漏。一般來說,即使您知道您不需要太多分配,並且您的程式很快就會結束,防止記憶體洩漏也是一個好主意。

(《記憶體管理》一書對此進行了更詳細的介紹)。

自動指標

[編輯 | 編輯原始碼]

自動指標現在已棄用(從 C++11 開始)。

自動指標讓您不必在完成使用記憶體位置後釋放記憶體。自動指標是 C++ 標準庫的一部分。


Clipboard

要做
使用自動指標的示例程式碼


注意
切勿將自動指標儲存在任何 STL 容器中。這樣做的原因是 STL 容器使用賦值操作。自動指標使用一種與容器設計方式不相容的非常具體的賦值行為。

智慧指標

[編輯 | 編輯原始碼]
Clipboard

要做
智慧指標的描述,參考 Boost 或 std::tr1

華夏公益教科書