2014-02-19 51 views
1

我最近使用了新的C++ 11功能,如std :: shared_ptr,因爲我將C代碼轉換爲類,並且在此代碼中存在大量「老式「指針。 我有一個疑問:在一個類的方法中,我使用本地shared_ptr,我可以初始化它們與傳遞到另一個smart_ptr引用的數據,然後修改數據? 例如:std :: shared_ptr使用其他shared_ptr數據初始化

void myFunction(std::shared_ptr<T> &my_reference) 
{ 
    std::shared_ptr<T> my_local_ptr(my_reference.get()); 

    /* Doing stuff on local pointer, 
     which modifies the object kept by my_reference pointer */ 
} 

我做錯了嗎?或者你認爲更好地直接修改my_reference中的數據,而不進行冗餘操作?

問候

邁克

+3

通過做你正在做什麼,你有*兩個*單獨的共享指針,具有單獨的引用計數,但都指向同一個對象。這通常不是一個好主意。如果你只是做'std :: shared_ptr my_local_ptr = my_reference;'正確的事情會自動發生「。 –

回答

2

你在做什麼是錯的(這在技術上是有效的代碼,但是你打算這可能不是你)。當像這樣構造時,my_local_ptr將指向與my_reference相同的對象,但它將具有其自己的引用計數(初始化爲1)。用標準術語說,它不會與my_reference「共享所有權」。

而且一旦my_local_ptr超出範圍,它會高興地調用刪除器 - 銷燬指向的對象,並使my_reference懸空。然後,當shared_ptrmy_reference共享所有權被破壞時,它將調用其刪除器,導致雙重刪除(除非在此之前懸空導致崩潰)。

如果你需要一個本地副本shared_ptr傳入的,(什麼啊?),絕對複製整個shared_ptr(包括所有權):現在

void myFunction(std::shared_ptr<T> &my_reference) 
{ 
    std::shared_ptr<T> my_local_ptr(my_reference); 

    /* Doing stuff on local pointer, 
     which modifies the object kept by my_reference pointer */ 
} 
+0

是的,我剛剛也讀過這個http://en.wikipedia.org/wiki/Smart_pointer 我不確定是否與純分配共享所有權。 – madduci

相關問題