understanding use_count with shared_ptr
understanding use_count with shared_ptr
我想出了下面的例子
std::shared_ptr<foo> a(new foo());
{
std::shared_ptr<foo> b = a;
std::cout << "before" << b.use_count() << "n"; //returns 2
b.reset();
std::cout << "after" << b.use_count() << "n"; //returns 0
}
std::cout << "Finishedn";
现在,在上面的代码中,第二个use_count
语句返回零。在这种情况下,析构函数不应该在输出"Finished"
之前被调用吗?为什么第二个语句中的use_count输出0 ?我读到use_count的定义是:
返回共享对象所有权的shared_ptr对象的个数与此对象(包括它)相同的指针。
如果我在使用计数之前做了一个reset()
,这仅仅意味着它的引用计数减少了1。如果我说错了,请纠正我。
这是我对正在发生的事情的理解,如果我错了请纠正我
std::shared_ptr<foo> a(new foo()); //reference count is 1
{
std::shared_ptr<foo> b = a; //reference count becomes 2
std::cout << "before" << b.use_count() << "n"; //returns 2 //OK this I understand
b.reset(); //b smart pointer gives up its reference count so now it should be 1.
std::cout << "after" << b.use_count() << "n"; //This should be 1 why is it 0 ?
}
std::cout << "Finishedn";
所以我的问题是为什么b.use_count()
返回0 ?
b.reset();
之后,b
为空(即不指向任何对象)。
根据标准(引用自N4527 §20.8.2.2.5[util.smartptr.shared.obs])
long use_count() const noexcept;
7返回:与
*this
、或0
共享所有权的shared_ptr
对象(包括*this
)的个数当*this
为空.
共享指针是c++中的一个概念,您可以在不同范围内拥有多个指向对象的指针,直到最后一个范围返回您的共享指针将无效,唯一指针只能通过std::move()传递给函数,因为它的定义,唯一指针意味着指向的对象的单一所有权。现在,因为你有一个share_ptr a(new foo()),然后你把它赋值给b,一旦在b shared_ptr类型上调用reset, b是无效的,因此返回零,但是如果你在a上执行操作use_count(),重置b后你会得到1的结果。
相关文章:
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- C++中的指针否定 (!ptr == NULL)
- 从const ptr*转换为ptr*时出现问题
- 无法使用 libtool 将 -shared 参数传递给 g++
- boost::shared_ptr和std::shared-ptr的同居
- 我可以用std::shared_ptr而不是boost::shared-ptr构建boost库吗
- shared-ptr-C++shared_ptr与unique_ptr用于资源管理