![]() |
1
22
引用计数控制指向对象的生存期。弱计数没有,但是 做 控制(或参与控制)的生命周期 控制块,控制块 。
如果引用计数变为
之间的分离
正在销毁
和
取消分配
指向对象是一个您不需要关心的实现细节,但它是由使用
如果你这样做了
您为
如果你这样做了
然后
现在清楚了吗? |
![]() |
2
7
weak\u ptr需要指向一些可以判断对象是否存在的东西,以便知道它是否可以转换为共享的\u ptr。因此,需要一个小对象来保存此信息。 删除上周ptr(或共享ptr)时,需要销毁此内务管理控制块。因此,它必须同时计算shared\u ptr和week\u ptr。 请注意,内务管理控制块与ptr指向的对象不同,因此week\u ptr不会影响对象的生存期。 根据您希望智能指针具有的行为,有许多不同的方法来实现智能指针。如果你想知道更多,我推荐Alexandrescu的“现代C++设计”( https://www.amazon.com/Modern-Design-Generic-Programming-Patterns/dp/0201704315 ) |
![]() |
3
2
weak\u ptr和shared\u ptr都指向包含控制块的内存。如果您在shared\u ptr计数器达到0时立即删除控制块(但弱计数器没有达到0),则会留下指向垃圾内存的弱\u ptr。然后,当您尝试使用weak\u ptr时,它会读取已释放的内存,并发生不好的事情(UB)。 因此,只要任何弱ptr可以尝试读取,控制块就必须保持活动状态(分配和构造,而不是销毁或释放)。 当共享计数器达到0时,主(指向的)对象将被销毁,并可能(希望)被释放。当两个计数器都达到0时,控制块将被销毁并释放。 |
![]() |
4
0
一个好的第一步是 摧毁 和 取消分配 在你脑海中清楚地表达出这个概念,这也是一个更可取的步骤,这是一个你不需要关心(善意地暗示)的实施细节,这是一个强化无知的步骤。
所以,让我们
承担总结职责,下面是我对你们每个问题的假设:
PS(或者更像BTW)
我个人的困惑不在于
|
![]() |
apetrai · 我应该如何假设算法使用哪种迭代器类别? 2 年前 |
![]() |
ridiculous_fish · std::是否保证短路? 2 年前 |
![]() |
Fabio · 在c中将指针赋给常数指针++ 2 年前 |
![]() |
johnco3 · 初始化固定C数组成员结构 6 年前 |
![]() |
mans · 为什么出现此错误:constexpr在此处无效 6 年前 |
![]() |
juztcode · 在C++中尝试捕获-创建了多少个对象 6 年前 |
![]() |
Steven Scott · 忽略元素的基于范围的for循环 6 年前 |