std :: bind一个std :: shared_ptr参数不会增加use_count

时间:2014-01-07 17:02:04

标签: c++ c++11

以下代码:

#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。

我正在使用clang ++

Apple LLVM 5.0版(clang-500.2.79)

我在调试模式下编译代码。

2 个答案:

答案 0 :(得分:8)

您的代码存在两个问题。

首先,您的复制构造函数未复制m_p

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

其次,你的bind导致临时丢弃;你应该抓住它(例如进入auto):

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

答案 1 :(得分:1)

std::bind的结果不存储在变量中,会立即丢弃。