我想出了以下示例
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?
答案 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的结果。