2014-01-07 9 views
7

は増えません。STDはSTDをバインド:: :: shared_ptrのパラメータには、次のコードはuse_count

#include <stdio.h> 
#include <memory> 
#include <functional> 

struct Foo{ 
    Foo(): 
     m_p(std::make_shared<int>()) 
    {} 
    Foo(const Foo &foo) 
    { 
     printf("copy\n"); 
    } 
    std::shared_ptr<int> m_p; 
}; 

void func(Foo foo) 
{} 

int main() 
{ 
    Foo foo; 
    std::function<void (void)> f = std::bind(func, foo); 
    printf("use count : %ld\n", foo.m_p.use_count()); 
    f(); 
} 

が結果だ:Fooのがコピーされているので

copy 
copy 
use count : 1 
copy 

を、私はm_pのはuse_countがあるべきと思いました2.

私が打ち鳴らす++

アップルLLVMのバージョン5.0(打ち鳴らす-500.2.79)

を使用しています

コードをデバッグモードでコンパイルします。

+3

+1だけSSCCE – Praetorian

答えて

8

コードには2つの問題があります。

まず、あなたのコピーコンストラクタはm_pをコピーされていません。

Foo(const Foo &foo): 
    m_p{foo.m_p} 
{ 
    printf("copy\n"); 
} 

第二に、すぐに破棄され、一時的にごbind結果。あなたは(例えばautoに)それをキャプチャする必要があります。

auto bar = std::bind(func, foo); 
+0

を投稿するため、私はこれらの問題を知っています。最初に、コピーコンストラクタはデフォルトでメンバーのコピーコンストラクタを呼び出します。次に、一時変数によって、コピーコンストラクタが2回呼び出されます。 – user1429171

+4

@ user1429171まず、デフォルトのコピーコンストラクタが生成されないように独自のコピーコンストラクタを用意していなければ、それは*でしょう。 second:コピーコンストラクタが呼び出されますが、デストラクタも同様に呼び出され、使用カウントがデクリメントされます(それは最高水準点ではありません)。 – ecatmur

+0

あなたは正しいです。ありがとう – user1429171

1

std::bindの結果は変数に格納されず直ちに破棄されます。

関連する問題