1. 程式人生 > >boost 智慧指標使用

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);