Preface:
對於使用 new 動態配置的資源,在不使用時必須記得 delete,以釋放記憶體空間,然而動態記憶體配置很容易發生忘了 delete,或是對同一個記憶體 位址 delete 兩次(例如一個物件被指定給兩個指標),或是對一個已經被 delete 的位址再作讀寫動作.
auto_ptr 自動管理配置資源:
C++ 標準函式庫中提供 auto_ptr,可以協助您動態管理 new 而建立的物件,要使用 auto_ptr,您要含入 memory 表頭檔,例如:
- #include
- auto_ptr<int> iPtr (new int(100));
- auto_ptr
sPtr (new string("caterpillar"));
- cout << *iPtr << endl; // 顯示100
- if(sPtr->empty())
- cout << "字串為空" << endl;
- auto_ptr<int> iPtr;
- if(iPtr.get() == 0) {
- iPtr.reset(new int(100));
- }
auto_ptr 可以使用另一個 auto_ptr 來建立,這會造成所有權的轉移,例如:
- #include
- #include
- #include "SafeArray.h"
- using namespace std;
- int main()
- {
- auto_ptr
ptr1(new SafeArray(1)); - ptr1->set(0,1);
- cout << "ptr1 address: " << ptr1.get() << "(" << ptr1->get(0) << ")" << endl;
- auto_ptr
ptr2(new SafeArray(1)); - ptr2->set(0,2);
- cout << "ptr2 address: " << ptr2.get() << "(" << ptr2->get(0) << ")" << endl;
- cout << "Assign ptr2 to ptr1..." << endl;
- ptr2 = ptr1;
- cout << "ptr2 address: " << ptr2.get() << "(" << ptr2->get(0) << ")" << endl;
- cout << "ptr1 address: " << ptr1.get() << endl;
- return 0;
- }
auto_ptr 的資源維護動作是以 inline 的方式來完成,也就是在編譯時會被擴展開來,所以使用auto_ptr 並不會犧牲效率. 最後要注意的是,auto_ptr 不能用來管理動態配置而來的陣列,如果用它來管理動態配置而來的陣列,結果是不可預期的!
Supplement:
* Cplusplus > Reference > memory > auto_ptr
* [C++ 小學堂] 關鍵字 inline 介紹
沒有留言:
張貼留言