淺談C++ auto_ptr智慧指標

2020-07-16 10:04:42
STL 還提供了另一個模板類:auto_ptr 類該類主要用於管理動態記憶體分配。

如果使用 new() 函數分配堆中的記憶體,而又不記得回收這部分記憶體,會導致記憶體漏失。因此必須使用 delete 語句釋放該記憶體塊。即使在函數末端新增了 delete 語句釋放記憶體,還需要在任何跳出該函數的語句(如丟擲異常)之前新增釋放記憶體的處理,例如 goto 語句和 throw 語句。

auto_ptr 模板定義了類似指標的物件,將 new 獲得的地址賦給該物件。當 auto_ptr 物件過期時,解構函式將使用 delete 來釋放記憶體。如果將 new 返回的地址賦值給 auto_ptr 物件,無須記住還需要釋放這些記憶體。在 auto_ptr 物件過期時,記憶體將自動被釋放。

在 C++ 語言中,要使用 STL 中的 auto_ptr 物件,必須包含標頭檔案 <memory>,該檔案包括 auto_ptr 模板。使用通常的模板句法來範例化所需型別的指標。auto_ptr 建構函式是顯式的,不存在從指標到 auto_ptr 物件的隱式型別轉換。

auto_ptr <double> pd;
double *p_reg = new double;
pd = p_reg; // 不允許
pd = auto_ptr <double> (p_reg); //允許
auto_ptr <double> panto =p_reg; //不允許
auto_ptr <double> pauto (p_reg); //允許

模板可以通過建構函式將 auto_ptr 物件初始化為一個常規指標。auto_ptr 是一個智慧指標,但其特性遠比指標要多。值得注意的是,在使用 auto_ptr 時,只能配對使用 new 和 delete。

提示,只能對 new 分配的記憶體使用 auto_ptr 物件,不要對由 new() 分配的或通過宣告變數分配的記憶體使用它。

總結

C++ 庫中的 auto_ptr 物件是一種智慧指標。智慧指標是一種類,即其物件的特徵結類似於指標。智慧指標儲存 new 分配的記憶體地址,也可以被解除參照。

智慧指標是一個類物件,可以修改和擴充簡單指標的行為。智慧指標可以建立參照計數,這使得多個物件可共用由智慧指標跟蹤的同一個值。當使用該值的物件數為 0 時,智慧指標將刪除該值。

智慧指標可以提高記憶體的使用效率,幫助防止記憶體洩露。