理解 use_count 和 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 << "Finished\n";

现在在上面的代码中,第二个 use_count 语句 returns 为零。 在那种情况下,不是应该在打印出 "Finished" 之前调用析构函数。为什么 use_count 在第二条语句中打印 0 ? 我读到 use_count 的定义是:

Returns the number of shared_ptr objects that share ownership over the same pointer as this object (including it).

如果我在使用计数之前做了一个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 << "Finished\n";

所以我的问题是为什么 b.use_count() 返回 0 ?

b.reset();之后,b空的(即不指向任何对象)。

根据标准(引自N4527 §20.8.2.2.5[util.smartptr.shared.obs])

long use_count() const noexcept;

7 Returns: the number of shared_ptr objects, *this included, that share ownership with *this, or 0 when *this is empty.

共享指针是 C++ 中的一个概念,您可以在不同范围内拥有多个指向一个对象的指针,并且只有在最后一个范围之前 returns 您的共享指针将无效,只能传递唯一指针对于使用 std::move() 的函数,因为它的定义,唯一指针意味着对所指向的对象的单一所有权。现在因为你有一个 share_ptr a(new foo()),然后你将它分配给 b,一旦 reset 在那个 b shared_ptr 类型上被调用,b 就无效因此 returns 零,但是如果你对 a 执行 use_count() 操作,你将在重置 b.

后得到 1 的结果