2017-06-02 11 views
0

私はいつもスマートポインタreset関数が生ポインタで使われているのを見てきました。別のスマートポインタを渡そうとすると失敗します。私はここで見た:http://en.cppreference.com/w/cpp/memory/shared_ptr/reset しかし、これについてはあまり言わない。これが事実であるかどうか確認したいだけですか?私のコードはここにある:https://wandbox.org/permlink/xKNtJhjGeOSZS7KN またここにあなたの便宜のために:shared_ptr :: resetはrawポインタでのみ動作しますか?

#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を使用)のみが正しい場合があります。

第3のshared_ptrがあった場合を考えてください。所有権をpwにするほど多くの権利があるので、pwは他の所で所有権を譲渡できません。

あなたはそれがウィジェットを共有する他のポインタには影響しないので、pw2pwの所有権を解放するためにpw2 = pw; pw.reset(nullptr);を行うことができます。

3

スマートポインタから生ポインタへの暗黙の変換は非常に危険です。それは起こらない。

スマートポインタが、別のスマートポインタが管理しているポインタを管理していると考えている場合は、どちらもそのポインタをクリーンアップする権利があると考えられます。そして、2人目がクリーンアップをしたときに悪いことが起こります。

生ポインタに所有権情報が含まれていません。

一方、共有ポインタを別の共有ポインタに割り当てると、ポインタの有効期間に関する情報も共有されます。したがって、2人は協力してポインタのライフタイムを管理し、最後にskopeを残すとクリーンアップが行われます。

関連する問題