auto ptr自動資源管理器

2021-07-16 10:18:50 字數 1378 閱讀 5831

對於使用new動態配置的資源,在不使用時必須記得delete,以釋放記憶體空間,然而動態記憶體配置很容易發生忘了delete,或是對同乙個記憶體位址delete兩次(例如乙個物件被指定給兩個指標),或是對乙個已經被delete的位址再作讀寫動作。

c++標準函式庫中提供auto_ptr,可以協助您動態管理new而建立的物件,要使用auto_ptr,您要含入memory表頭檔,例如:

#include

auto_ptr可以指向乙個以new建立的物件,當auto_ptr的生命週期結束後,所指向的物件之資源也會被釋放,在建立auto_ptr時必須指定目標物件之型態,例如:

auto_ptriptr (new int(100));

auto_ptrsptr (new string("caterpillar"));

操作auto_ptr就像操作沒有使用auto_ptr的指標一樣,例如:

cout<< *iptr<< endl; // 顯示100

if(sptr->empty())

cout << "字串為空" <

您也可以建立乙個未指向任何物件的auto_ptr,例如:

auto_ptriptr;

未指向任何物件的auto_ptr不可以取值,否則會發生不可預期之結果,既然不可取值,如何判斷它是否有指向物件呢?您可以使用get()函式,它會傳回所指向物件的位址,如果傳回0,表示不指向任何物件,如果不指向任何物件,您可以使用reset()來讓它指向乙個物件,例如:

if(iptr.get()== 0)

reset()可以接受乙個指標或是0表示不指向任何物件,reset()會先delete目前指向的物件,然後重新指向新的物件,您也可以使用release()釋放auto_ptr管理所指向物件的職責。

auto_ptr可以使用另乙個auto_ptr來建立,這會造成所有權的轉移,例如:

auto_ptrptr1(new safearray(19));

auto_ptrptr2(ptr1);

當使用ptr1來建立ptr2時,ptr1不再對所指向物件的資源釋放負責,職責交給了ptr2,在使用指定運算時,也有類似的行為,例如:

auto_ptrptr1(new safearray(19));

auto_ptrptr2(new safearray(20));

ptr2= ptr1;

ptr2所指向的物件會先被delete,然後ptr1的屬性會複製至ptr2,也就是ptr1所指向的物件,現在由ptr2指向它了,ptr1不再負責所指向物件的資源釋放。

auto_ptr的資源維護動作是以inline的方式來完成,也就是在編譯時會被擴充套件開來,所以使用auto_ptr並不會犧牲效率。

最後要注意的是,auto_ptr不能用來管理動態配置而來的陣列,如果用它來管理動態配置而來的陣列,結果是不可預期的。

資源管理器

using system using system.collections.generic using system.linq using system.text using system.threading.tasks namespace day 09 小型資源管理器 檔案長度 public st...

簡單資源管理器

下面共享乙個我自己的資源管理器,很簡單的,看起來也明白,主要是我是新手,不想寫的太複雜,自己專案使用的好用,便是最好的。using unityengine using system.collections using system.collections.generic using system p...

Windows資源管理器

在資源管理器中,選定多個非連續檔案的操作為 a 按住shift鍵,單擊每乙個要選定的檔案圖示 b 按住ctrl鍵,單擊每乙個要選定的檔案圖示 c 先選中第乙個檔案,按住shift鍵,再單擊最後乙個要選定的檔案圖示 d 先選中第乙個檔案,按住ctrl鍵,再單擊最後乙個要選定的檔案圖示 檔案abc.bm...