使用 shared_ptr 时如何理解 use_count。

4
我想到了以下例子。
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语句返回零。那么在打印出"Finished"之前,析构函数不应该被调用吗?为什么第二个语句中的use_count打印0?
我读到use_count的定义是:
返回与此对象共享所有权的shared_ptr对象数量(包括它本身)。
如果我在use count之前执行了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?

1
你重置了变量 b 之后,它与其他人共享了什么? - Mat
2个回答

4
在执行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.


2
一个shared pointer是C++中的一个概念,它允许你在不同的作用域中有多个指向同一对象的指针,只有当最后一个作用域返回时,你的共享指针才会失效。unique pointer只能使用std::move()传递给函数,因为它的定义意味着对该被指向的对象具有单一所有权。现在,如果你有一个shared_ptr a(new foo()),然后将其分配给b,一旦在b shared_ptr类型上调用reset,b就无效了,因此返回零。但是,如果你在a上执行use_count()操作并重置b后,你将得到1的结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接