2017-05-23 1 views
10

次のコードスニペットでは、メソッドの参照カウントが異なります。誰かがこれらの値が異なる理由を説明できますか?なぜconst shared_ptr <const T>&const shared_ptr <T>&異なる参照カウントを表示するのですか?

class Foo { 
}; 

void f1(const std::shared_ptr<Foo>& ptr) { 
    std::cout << "f1(): counts: " << ptr.use_count() << std::endl; 
} 

void f2(const std::shared_ptr<const Foo>& ptr) { 
    std::cout << "f2(): counts: " << ptr.use_count() << std::endl; 
} 

int main() { 
    std::shared_ptr<Foo> ptr(new Foo); 
    std::cout << "main(): counts: " << ptr.use_count() << std::endl; 

    f1(ptr); 
    f2(ptr); 

    std::cout << "main(): counts: " << ptr.use_count() << std::endl; 

    return 0; 
} 

対応する出力:

main(): counts: 1 
f1(): counts: 1 
f2(): counts: 2 
main(): counts: 1 
+2

f2呼び出しは、shared_ptr からshared_ptr への変換の一部として暗黙的な一時オブジェクトを作成しなければならない可能性があります。これは、f2が実行されているときの第2の参照カウントです。 –

+0

ありがとう!意味をなさない –

+5

全く関係ありません、単にFYI: 'new'の代わりに' make_shared'を使うべきです(https://herbsutter.com/2013/05/29/gotw-89-solution-smart-pointers/) – Tas

答えて

11

std::shared_ptr<Foo>std::shared_ptr<const Foo>が異なる種類(異なるテンプレート型引数を持つ、すなわちクラステンプレートのインスタンスが異なる種類である)であること。

もしf2ptr(すなわちstd::shared_ptr<Foo>)を通過するとき、直接std::shared_ptr<const Foo>に参照するために結合することができません。一時的なstd::shared_ptr<const Foo>を構築してから、パラメータptrにバインドする必要があります。構成されたshared_ptrは元のshared_ptrと所有権を共有するため、use_countは2に変更され、f2()になります。

f2(ptr);が終了すると一時的に破壊されます。 use_countが1に減少します。

+0

初期化を 'std :: shared_ptr ptr(new Foo);'に変更し、 'f2(ptr)'と呼びました。今、refcountが増分されていないことがわかります。 非常に感謝しています! –

+0

@ArupRatonRoyはい、この場合、一時的なトラブルはありません。 – songyuanyao

関連する問題