當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


C++ auto_ptr用法及代碼示例


在 C++ 中,當 de-allocating 是指針時可能會發生內存泄漏。因此,為了確保代碼免受內存泄漏和異常的影響,C++ 中引入了一種特殊的指針類別,稱為智能指針。在本文中,我們將討論自動指針(auto_ptr),它是 C++ 中的智能指針之一。

先決條件: C++中的指針,C++ 中的智能指針

Note: Auto Pointer was deprecared in C++11 and removed in C++17

C++ 中的自動指針 (auto_ptr)

auto_ptr 是一個智能指針,它管理通過 new 表達式獲得的對象,並在 auto_ptr 本身被銷毀時刪除該對象。一旦對象被銷毀,它就會de-allocates分配的內存。 auto-ptr對該對象具有所有權控製,它基於獨占所有權模型,該模型表示一個內存塊不能由多個相同類型的指針指向。

當使用 auto_ptr 定義對象時,它會存儲指向已分配對象的指針,並確保當 auto_ptr 本身超出範圍時,它指向的內存也會被銷毀。

auto_ptr 的語法

C++中的自動指針定義為:

auto_ptr <type> pointer_name = value;

為什麽我們需要auto_ptr?

使用auto_ptr的目的是防止由於使用原始指針而導致代碼中的資源或內存泄漏和異常。讓我們看一個內存泄漏的例子。考慮以下代碼:

C++


void memLeak() { 
  classA *ptr = new classA(); 
  // some code 
    
  delete ptr; 
}

在上麵的代碼中,我們使用delete來釋放內存以避免內存泄漏。但是如果在到達刪除語句之前發生異常怎麽辦?在這種情況下,內存不會被釋放。因此,需要一個指針,可以在指針本身被銷毀後釋放它所指向的內存。

上麵的例子可以使用auto_ptr重寫為:

C++


void memLeakPrevented() { 
  auto_ptr<classA> ptr(new classA()); 
  // some code 
}

使用auto_ptr 時不再需要刪除語句。

Note: The arithmetic functions on pointers are not valid for auto_ptr such as increment & decrement operators.

C++ 中的 auto_ptr 示例

C++


// C++ program to illustrate the use of auto_ptr 
#include <iostream> 
#include <memory> 
  
using namespace std; 
  
// creating class with overloaded constructor and destructor 
class Integer { 
public: 
    Integer() { cout << "Object Created" << endl; } 
  
    ~Integer() { cout << "Object Destroyed" << endl; } 
}; 
  
// driver code 
int main() 
{ 
    // creating auto pointer to Integar class 
    auto_ptr<Integer> ptr(new Integer()); 
  
    // not using delete 
  
    return 0; 
}
輸出
Object Created
Object Destroyed

在此示例中,我們創建了一個 auto_ptr 對象 ptr 並使用指向動態分配的 Integer 對象的指針對其進行初始化。

由於ptr是main()中的局部自動變量,因此當main()終止時ptr被銷毀。 auto_ptr 析構函數強製刪除 ptr 指向的 Integer 對象,該對象又調用 Integer 類析構函數。 Integer 占用的內存被釋放。當auto_ptr對象的析構函數被調用時,Integer對象將被自動刪除。

為什麽auto_ptr被刪除?

auto_ptr 在 C++ 11 中被折舊,並在 C++ 17 中被刪除。刪除 auto_ptr 是由於以下限製:

  1. 一個auto_ptr不能用於指向數組。在刪除指向數組的指針時,我們需要使用刪除[]但在auto_ptr我們隻能使用刪除.
  2. 一個auto_ptr不能與 STL 容器一起使用,因為容器或操作它們的算法可能會複製存儲的元素。 auto_ptrs 的副本不相等,因為原始設置為NULL被複製後。
  3. auto_ptr 不適合移動語義,因為它們通過使用複製操作來實現移動。

由於上述限製,auto_ptr 從 C++ 中刪除,後來替換為 unique_ptr



相關用法


注:本文由純淨天空篩選整理自nikhilsharma9060大神的英文原創作品 auto_ptr in C++。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。