boost 智慧型指標使用

2021-08-03 21:46:31 字數 1786 閱讀 3597

1、scoped_ptr

基本功能類似auto_ptr。首先確保任何時候物件都能被正確的刪除。且 scoped_ptr所有權不能轉讓,一旦獲取,無法從它那裡取回。

//scoped_ptr 不能作為容器的元素,不允許不支援拷貝和賦值,因為拷貝和賦值函式是私有的。

//即,不存在 sp1 = sp2 這樣的操作。

scoped_ptrsp(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_arraysa(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_ptrspi(new int(10));

shared_ptrsps(new string("smart"));

typedef vector> vs;   //乙個持有shared_ptr的標準容器

vs v(10);                             //宣告乙個10元素的容器, 初始化為空指標

int i = 0;

for (auto iter = v.begin(); iter != v.end(); ++ iter)

std::cout << std::endl;

//eg;

shared_ptrspfac = make_shared("make_shared");

shared_ptr> spvec = make_shared>("string", 10);

/*有兩種方法將shared_ptr用於容器

1、 將容器作為shared_ptr的管理物件, 如shared_ptr>,使容器可以被安全的共享,用法與普通shared_ptr相同。 如  shared_ptrpp = v[9];

2、 將shared_ptr作為容器的元素,如vector>

*/shared_ptr();  //shared_ptr可以儲存void*型別指標

4、shared_array

/建構函式接受的指標必須是new的結果 不是new()的結果。沒有*, ->操作符的過載

//析構函式必須是delete 釋放, 不是delete

//過載operator,像陣列一樣的用下標訪問元素

int * pi = new int[100];

shared_arraysaa(pi);

shared_arraysaa2 = saa;

saa[0] = 10;    //shared_array 過載operator

assert(saa2[0] == 10);

boost 智慧型指標

boost shared ptr 的記憶體管理機制 boost shared ptr 的管理機制其實並不複雜,就是對所管理的物件進行了引用計數,當新增乙個 boost shared ptr 對該物件進行管理時,就將該物件的引用計數加一 減少乙個 boost shared ptr 對該物件進行管理時,...

boost 智慧型指標

最近使用boost的智慧型指標,檢視了一些帖子。總結如下 智慧型指標分類 智慧型指標使用注意事項 多執行緒安全性分析 這個帖子的結論很好,1 shared ptr是乙個非常實用的智慧型指標。2 shared ptr的實現機制是在拷貝構造時使用同乙份引用計數。3 對同乙個shared ptr的寫操作不...

boost 智慧型指標

shared 指標類似於乙個帶計數器的指標,當指標計數次數為0時,它將自動析構物件。shared ptr指標可通過一次new出來,一直向下傳遞,直到每次析構shared ptr時將該指標引用量 1 注 每次進行不帶引用的傳遞時呼叫次數會加1,但析構時同時會 1,若用引用傳遞,每次呼叫值不增加,但同樣...