2017-06-02 87 views
0

我一直看到與原始指針使用智能指針reset功能。當我嘗試傳遞另一個智能指針時,它失敗。我看了這裏:http://en.cppreference.com/w/cpp/memory/shared_ptr/reset 但它沒有多說這個。只是想確認是否屬於這種情況?我的代碼是在這裏:https://wandbox.org/permlink/xKNtJhjGeOSZS7KN 這裏還爲您提供方便:shared_ptr :: reset只適用於原始指針?

#include<iostream> 
using std::cout; using std::endl; 
#include<memory> 
using std::shared_ptr; 

class Widget 
{ 
public: 
    ~Widget() 
    { 
    cout << "Hi from destructor" << endl; 
    } 
}; 

auto wdel = [](Widget* pw) 
      { 
       cout << "Hi from custom deleter" << endl; 
       delete pw; 
      }; 

int main() 
{ 
    { 
    shared_ptr<Widget> pw(nullptr,wdel); 
    pw.reset(new Widget); 
    cout << "Done reset" << endl; 
    shared_ptr<Widget> pw2(nullptr,wdel); 
    // pw = pw2; // this works 
    pw2.reset(pw); // this does not work 
    } 
    return 0; 
} 

預先感謝您。

+3

「[..]但它沒有多說這個」它說'reset'需要一個'T *'作爲參數.... – user463035818

+0

哦,我以爲你可以傳遞一個智能指針,一個原始指針?還是沒有隱式轉換?對不起,我從來沒有使用過智能指針。我認爲這是情況(雖然沒有隱式轉換),謝謝! @ tobi303 - 你想回復那個,所以我可以接受你的答案? :) – pss

回答

4

pw2 = pw是正確的事情,只有副本(使用shared_ptr::operator&shared_ptr::shared_ptr)可以是正確的。

考慮一下如果有第三shared_ptr。這樣可以保留pw的所有權,因此pw不能被允許將其他所有權轉讓給其他人。

您可以做pw2 = pw; pw.reset(nullptr);pw的所有權發佈到pw2,因爲這不會影響其他共享該Widget的指針。

3

從智能指針到裸指針隱式轉換是很危險的。所以它不會發生。

如果智能指針認爲它是管理的指針其它智能指針是管理,既會認爲他們已經把它清理乾淨的權利。當第二個人進行清理時,通常會發生壞事。

原始指針不包含所有權信息。

在另一方面,當你一個共享指針分配給另一個,約指針的壽命有關的信息也被共享。所以兩者合作管理指針的生命週期,最後一個離開skope進行清理。