2010-12-01 77 views
6

我是shared_ptr的新手。我有一個關於C的語法++ 0x中的shared_ptr如下幾個問題:shared_ptr的基本語法問題

//first question 
shared_ptr<classA>ptr(new classA()); //works 
shared_ptr<classA>ptr; 
ptr = ?? //how could I create a new object to assign it to shared pointer? 


//second question 
shared_ptr<classA>ptr2; //could be tested for NULL from the if statement below 
shared_ptr<classA> ptr3(new classA()); 
ptr3 = ?? //how could I assign NULL again to ptr3 so that the if statement below becomes true? 

if(!ptr3) cout << "ptr equals null"; 

回答

0

嘗試ptr3.reset(NULL)

10
shared_ptr<classA> ptr; 
ptr = shared_ptr<classA>(new classA(params)); 
// or: 
ptr.reset(new classA(params)); 
// or better: 
ptr = make_shared<classA>(params); 

ptr3 = shared_ptr<classA>(); 
// or 
ptr3.reset(); 

編輯:只是爲了總結爲什麼make_shared最好顯式調用new

  1. 一些(所有?)實現爲構造的對象和計數器/刪除器使用一個內存分配。這提高了性能。

  2. 這是異常安全的,假設一個函數接受兩個shared_ptrs:

    f(shared_ptr<A>(new A), shared_ptr<B>(new B)); 
    

    由於評價的順序是沒有定義,一個可能的評估可能是:構造A,構造B,初始化share_ptr<A>,初始化shared_ptr<B>。如果B拋出,你會漏出A.

  3. 分離責任。如果shared_ptr負責刪除,也要負責分配。

+0

爲什麼make_shared更好地在這裏? – 2010-12-01 09:28:24

0

我怎麼能創建一個新的對象來 它分配給共享指針?

你要「重置」的共享指針:

classA* my_pointer = new classA(); 
shared_ptr<classA>ptr; 
ptr.reset(my_pointer); 

我怎麼能分配NULL再次PTR3 使得若跌破語句變成 真的嗎?

再次,通過復位,但不帶參數(或空)

ptr3.reset();