主要观点:
- 探讨了共享指针泄漏问题,包括循环引用、松散引用、弱引用等情况,指出其难以察觉且调试困难。
- 介绍了比良好实践更有效的方法——实现 xmem 库,它是标准智能指针的替代实现,可通过更换控制块来收集元数据以检测泄漏。
- 以一个共享指针泄漏的示例程序为例,展示了如何使用 xmem 库进行泄漏检测,包括重新实现共享指针、添加元数据记录功能等。
关键信息:
- 共享指针通过引用计数管理内存,控制块用于记录引用计数等信息。
- 经典泄漏检测器可记录分配和释放,但不能确定是否泄漏。
- xmem 库可替换标准智能指针,其控制块工厂是模板参数,可用于收集元数据。
- 在示例程序中,通过重新实现共享指针并添加元数据记录函数,实现了对泄漏的检测和定位。
重要细节:
- 共享指针的引用计数在复制、移动等操作时会增加或减少,最后一个引用的共享指针销毁时会释放资源。
- 循环引用会导致引用计数永远不为零,从而产生泄漏;松散引用可能因未正确移除而导致泄漏;弱引用不会影响引用计数,但对象销毁后控制块内存仍可能保留。
- xmem 库中的
bookkeeping_control_block
类用于记录共享指针的相关信息,如创建时间、堆栈跟踪等,并通过锁来保证线程安全。 - 在示例程序中,通过
on_new_strong
和on_destroy_strong
函数记录共享指针的创建和销毁信息,在检测到泄漏时输出相关信息以确定泄漏的位置和指针。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。