boost 智慧指標使用
1、scoped_ptr
基本功能類似auto_ptr。首先確保任何時候物件都能被正確的刪除。且 scoped_ptr所有權不能轉讓,一旦獲取,無法從它那裡取回。
//scoped_ptr 不能作為容器的元素,不允許不支援拷貝和賦值,因為拷貝和賦值函式是私有的。
//即,不存在 sp1 = sp2 這樣的操作。
scoped_ptr<string> sp(new string("test"));
std::cout << *sp << std::endl;
std::cout << sp->size() << std::endl;
//sp is smart_ptr, not use delete for it.
成員函式reset()功能是重置scoped_ptr,刪除原來儲存的指標,在儲存新的指標值。
2、scoped_array
//建構函式接受的指標必須是new[]的結果 不是new()的結果。沒有*, ->操作符的過載
//解構函式必須是delete[] 釋放, 不是delete
//過載operator[],像陣列一樣的用下標訪問元素
scoped_array<int> sa(new int[100]);
std::fill_n(&sa[0], 100, 5);
sa[10] = sa[20] + sa[30];
sa[0] = 10;
// *(sa + 1) = 20; //錯誤的用法,因為過載operator[], 不支援陣列首地址+N的方式訪問陣列元素
3、shared_ptr
//shared_ptr 是執行緒安全的, 一個shared_ptr可以被多個執行緒安全讀取
shared_ptr<int> spi(new int(10));
shared_ptr<string> sps(new string("smart"));
typedef vector<shared_ptr<int>> vs; //一個持有shared_ptr的標準容器
vs v(10); //宣告一個10元素的容器, 初始化為空指標
int i = 0;
for (auto iter = v.begin(); iter != v.end(); ++ iter)
{
(*iter) = make_shared<int>(i++); //應該試用工廠函式來消除對new的大量使用, 可接受10多個引數,引數將傳遞給型別T的建構函式,建立一個shared_ptr<T>物件並返回
std::cout << *(*iter) << ",";
}
std::cout << std::endl;
//eg;
shared_ptr<std::string> spFac = make_shared<std::string>("make_shared");
shared_ptr<vector<string, int>> spVec = make_shared<vector<string, int>>("string", 10);
/*有兩種方法將shared_ptr用於容器
1、 將容器作為shared_ptr的管理物件, 如shared_ptr<List<T>>,使容器可以被安全的共享,用法與普通shared_ptr相同。 如 shared_ptr<int> pp = v[9];
2、 將shared_ptr作為容器的元素,如vector<shared_ptr<int>>
*/
shared_ptr<void *>(); //shared_ptr可以儲存void*型別指標
4、shared_array
/建構函式接受的指標必須是new[]的結果 不是new()的結果。沒有*, ->操作符的過載
//解構函式必須是delete[] 釋放, 不是delete
//過載operator[],像陣列一樣的用下標訪問元素
int * pI = new int[100];
shared_array<int> saa(pI);
shared_array<int> saa2 = saa;
saa[0] = 10; //shared_array 過載operator[]
assert(saa2[0] == 10);