我正在学习shared_ptr
的别名构造函数,我写了这样的代码
int main(){
std::shared_ptr<Father> father = std::make_shared<Father>();
std::shared_ptr<Son> son(father, &father->son);
printf("%dn", father.use_count());
printf("%dn", son.use_count());
father.reset();
printf("%dn", father.use_count());
printf("%dn", son.use_count());
printf("%dn", father.owner_before(son));
printf("%dn", son.owner_before(father));
return 0;
}
然后打印出
2
2
0
1
1
0
我在这里迷路了。在我看来,father.reset()
之后,father
仍然应该是use_count = 1
而不是0,因为子是由父构建的别名,而不是被破坏的。从这篇文章中,作者也说father.use_count()
是1。
//Foo仍然存在(ref == 1)//我们的Bar指针仍然有效,我们可以用它来表示
那么为什么printf("%dn", father.use_count());
输出为0?
在father.reset()
之后,father
没有指向任何东西。它保存一个空值(官方的说法是"没有管理对象")。
你打印的是什么都没有的use_count
,而不是Father
或Son
对象的use_count
,并且空指针的use_count
是0。