如果我调用std::make_shared<T>
(而不仅仅是shared_ptr<T>
显式分配),那么出于性能原因,我希望引用计数与 T 的实例一起分配在内存中。一切都很好。
但是,如果我有weak_ptr
引用同一个对象的实例,大概他们将需要访问该引用计数,以了解该对象是否仍然存在。
因此,当 T 的实例的最后一个 shared_ptr 被销毁时,对系统的幼稚理解意味着它无法释放存储 T 的内存,因为weak_ptrs 仍然需要访问该计数。
似乎有一个单独的弱引用计数器,理论上可以与 T 的实例分开保存,以便可以在弱引用仍然存在时销毁 T 并释放内存。但随后我们又回到了 2 个单独的分配,阻碍了make_shared
.
我想我在这里误解了一些东西。std::make_shared
当弱引用存在时,如何释放为通过构造的实例分配的内存?