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

use*_*171 7 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();
}
Run Code Online (Sandbox Code Playgroud)

得到的结果:

copy
copy
use count : 1
copy
Run Code Online (Sandbox Code Playgroud)

由于Foo被复制,我认为m_p的use_count应为2.

我正在使用clang ++

Apple LLVM 5.0版(clang-500.2.79)

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

eca*_*mur 8

您的代码有两个问题.

首先,您的复制构造函数不是复制m_p:

Foo(const Foo &foo):
    m_p{foo.m_p}
{
    printf("copy\n");
}
Run Code Online (Sandbox Code Playgroud)

第二,你的bind结果在一个临时的,立即被丢弃; 你应该抓住它(例如进入auto):

auto bar = std::bind(func, foo);
Run Code Online (Sandbox Code Playgroud)

  • @ user1429171首先:如果你没有提供自己的复制构造函数来阻止生成默认的复制构造函数,它会*!第二:调用复制构造函数,但也调用析构函数,减少使用计数(它不是高水位线). (4认同)