理解 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 的结果
我想到了下面的例子
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
, or0
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 的结果