std::bind std::shared_ptr 参数不会增加use_count
std::bind a std::shared_ptr parameter won't increase use_count
以下代码:
#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
的结果不会存储在变量中,会立即被丢弃。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 数组索引的值没有增加
- 从持续时间构造std::chrono::system_clock::time_point
- 有效地使用std::unordered_map来插入或增加键的值
- 如何增加以前由新运算符分配的 C++ std::list 数组的大小?
- std::thread 增加 DLL 引用计数,从而防止卸载 DLL
- std::嵌入增加的链接时间
- std::bind std::shared_ptr 参数不会增加use_count
- 为什么使用 std::vector<> 而不是 std::list<>会导致代码大小增加?
- 如何正确地增加c++ 11的std::atomic
- std::vector *必须*在增加容量时移动对象吗?或者,分配器可以"reallocate"吗?
- 为什么std::copy_n没有将Input迭代器增加n次
- 将对象存储在std::向量中是否会增加对象的寿命
- 防止gcc中的std::函数分配内存或增加阈值
- 根据标准::<T>位集<N>增加 std::vector 中的元素
- 如何增加std::共享指针的所有权计数