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 時,智慧指標將刪除該值。
智慧指標可以提高記憶體的使用效率,幫助防止記憶體洩露。