如果我调用std::make_shared<T>(而不是仅仅shared_ptr<T>显式分配),那么出于性能原因,我希望引用计数在T的实例旁边分配.一切都很好.
但是如果我有weak_ptr引用相同对象的实例,可能他们需要访问该引用计数,以了解该对象是否仍然存在.
因此,当T的实例的最后一个shared_ptr被销毁时,对系统的天真理解意味着它不能释放存储T的内存,因为weak_ptrs仍然需要访问该计数.
似乎有一个单独的弱引用计数器,理论上它可以与T的实例分开保存,这样T可以被破坏,内存释放,而弱引用仍然存在.但后来我们又回到了两个单独的分配,挫败了它的好处make_shared.
我想我在这里误解了一些东西.std::make_shared当存在弱引用时,如何释放为构造的实例分配的内存?
Jam*_*lis 13
如果您使用make_shared并且如果实现对对象和引用计数使用单个分配,则在释放所有引用(强和弱)之前,不能释放该分配.
但是,在释放所有强引用后,对象将被销毁(无论是否仍存在弱引用).