了解use_count与shared_ptr

时间:2015-08-06 05:34:00

标签: c++ c++11 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语句返回零。 在这种情况下,析构函数假设在打印出"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 << "Finished\n";

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

2 个答案:

答案 0 :(得分:4)

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

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

long use_count() const noexcept;
     

7返回:shared_ptr个对象的数量,*this包含的内容,*this共享所有权0   *this 为空时

答案 1 :(得分:1)

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