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

std::bind a std::shared_ptr parameter won't increase use_count

本文关键字:std 增加 use count ptr bind shared 参数      更新时间:2023-10-16

以下代码:

#include <stdio.h>
#include <memory>
#include <functional>
struct Foo{
    Foo():
        m_p(std::make_shared<int>())
    {}
    Foo(const Foo &foo)
    {
        printf("copyn");
    }
    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 : %ldn", foo.m_p.use_count());
    f();
}

得到的结果:

copy
copy
use count : 1
copy

由于Foo是复制的,我认为m_p的use_count应该是2。

我正在使用叮当++

Apple LLVM 版本 5.0 (clang-500.2.79)

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

您的代码有两个问题。

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

Foo(const Foo &foo):
    m_p{foo.m_p}
{
    printf("copyn");
}

其次,你的bind会导致一个临时的,它立即被丢弃;你应该捕获它(例如,进入一个auto):

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

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