当我们重置一个shared_ptr时,如果有其他的shared_ptr别名是从它构造的,会发生什么?



我正在学习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,而不是FatherSon对象的use_count,并且空指针的use_count是0。

相关内容

  • 没有找到相关文章

最新更新