一些缺陷
- 公用引用计数,计数器通过
new
放在堆上,引起性能问题 - 引用计数的内存位置和数据的内存位置不一致,缓存失效等性能问题
- 容易出现一个对象被绑定了两个引用计数,双重删除。
解决方法
std::make_shared
std::make_shared
的作用是在为数据分配空间的同时,分配计数器的空间(从实际实现是反过来,在分配计数器空间的空时,多分配一块空间给数据用),让数据和计数器在连续的内存区域,对 CPU 缓存也友好。同时不用暴露原始指针,也降低了第三个问题的出现几率:
make_shared将会导致对象的内存和计数器的内存合并分配,这时当对象已被销毁时,如果计数器还没销毁,对象的内存空间也不会释放,这和boost::intrusive
侵入式指针的设计相反。
std::enable_shared_from_this
它是一种侵入式设计,和boost::intrusive
比较相似。