2014-01-07 52 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(); 
} 

得到了結果:

copy 
copy 
use count : 1 
copy 

既然foo被複制,我還以爲M_P的use_count應2.

我使用鐺++

蘋果LLVM 5.0版(鐺-500.2.79)

我在調試模式下編譯代碼。

+3

+1只是爲了發佈一個SSCCE – Praetorian

回答

8

您的代碼有兩個問題。

首先,你的拷貝構造函數是不是抄襲m_p

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

其次,你的bind導致暫時被立即丟棄;你應該捕捉它(例如爲auto):

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

我知道這些問題。首先,複製構造函數默認會調用成員的複製構造函數。其次,臨時變量會使複製構造函數調用兩次。 – user1429171

+4

@ user1429171第一:如果你沒有提供你自己的拷貝構造函數來防止默認的生成;第二:調用拷貝構造函數,但也調用析構函數,減少使用次數(它不是高水位標記)。 – ecatmur

+0

你說得對。謝謝 – user1429171

1

std::bind的結果不存儲在變量中,並立即丟棄。

相關問題