一些缺陷

  1. 公用引用计数,计数器通过new放在堆上,引起性能问题
  2. 引用计数的内存位置和数据的内存位置不一致,缓存失效等性能问题
  3. 容易出现一个对象被绑定了两个引用计数,双重删除。

解决方法

  1. std::make_shared

std::make_shared的作用是在为数据分配空间的同时,分配计数器的空间(从实际实现是反过来,在分配计数器空间的空时,多分配一块空间给数据用),让数据和计数器在连续的内存区域,对 CPU 缓存也友好。同时不用暴露原始指针,也降低了第三个问题的出现几率:

make_shared将会导致对象的内存和计数器的内存合并分配,这时当对象已被销毁时,如果计数器还没销毁,对象的内存空间也不会释放,这和boost::intrusive侵入式指针的设计相反。

  1. std::enable_shared_from_this

它是一种侵入式设计,和boost::intrusive比较相似。