引用计数智能指针的引用计数如何工作?

Sri*_*nth 28 c++ memory-leaks memory-management smart-pointers shared-ptr

换句话说,实现如何跟踪计数?

是否存在一个类似于地图的对象,所有shared_ptr实例都可以访问它们,其键是指针的地址,值是引用的数量?如果我要实现一个shared_ptr,这是我想到的第一个想法.

在这些引用计数智能指针的情况下是否存在内存泄漏的可能性?如果是这样,我该如何避免它们?

Fer*_*cio 65

我已经看到了两种不同的非侵入式方法:

  1. 智能指针分配一小块内存来包含引用计数器.然后,智能指针的每个副本接收指向实际对象的指针和指向引用计数的指针.
  2. 除了对象指针之外,每个智能指针还包含前一个和下一个指针,从而形成指向特定对象的智能指针的双向链接列表.引用计数隐含在列表中.复制智能指针时,它会将自身添加到列表中.销毁后,每个智能指针都会从列表中删除.如果它是列表中的最后一个,那么它也会释放引用的对象.

如果你去这里滚动到底部,有一个很好的图表可以更清楚地解释这些方法.

  • 链表方法避免了额外的分配,但是如果没有全局互斥锁,很难做出"线程安全".("线程安全",如"作为原始指针的线程安全") (2认同)
  • 此外,如果您使用`make_shared`,它还可以通过将分配的对象和实例计数器放在单个内存块中来避免额外的分配. (2认同)