understanding use_count with shared_ptr

understanding use_count with shared_ptr

本文关键字:shared ptr with count use understanding      更新时间:2023-10-16

我想出了下面的例子

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返回:*this0共享所有权shared_ptr对象(包括*this)的个数当*this 为空.

共享指针是c++中的一个概念,您可以在不同范围内拥有多个指向对象的指针,直到最后一个范围返回您的共享指针将无效,唯一指针只能通过std::move()传递给函数,因为它的定义,唯一指针意味着指向的对象的单一所有权。现在,因为你有一个share_ptr a(new foo()),然后你把它赋值给b,一旦在b shared_ptr类型上调用reset, b是无效的,因此返回零,但是如果你在a上执行操作use_count(),重置b后你会得到1的结果。