跟踪共享指针泄漏

主要观点:

  • 探讨了共享指针泄漏问题,包括循环引用、松散引用、弱引用等情况,指出其难以察觉且调试困难。
  • 介绍了比良好实践更有效的方法——实现 xmem 库,它是标准智能指针的替代实现,可通过更换控制块来收集元数据以检测泄漏。
  • 以一个共享指针泄漏的示例程序为例,展示了如何使用 xmem 库进行泄漏检测,包括重新实现共享指针、添加元数据记录功能等。

关键信息:

  • 共享指针通过引用计数管理内存,控制块用于记录引用计数等信息。
  • 经典泄漏检测器可记录分配和释放,但不能确定是否泄漏。
  • xmem 库可替换标准智能指针,其控制块工厂是模板参数,可用于收集元数据。
  • 在示例程序中,通过重新实现共享指针并添加元数据记录函数,实现了对泄漏的检测和定位。

重要细节:

  • 共享指针的引用计数在复制、移动等操作时会增加或减少,最后一个引用的共享指针销毁时会释放资源。
  • 循环引用会导致引用计数永远不为零,从而产生泄漏;松散引用可能因未正确移除而导致泄漏;弱引用不会影响引用计数,但对象销毁后控制块内存仍可能保留。
  • xmem 库中的bookkeeping_control_block类用于记录共享指针的相关信息,如创建时间、堆栈跟踪等,并通过锁来保证线程安全。
  • 在示例程序中,通过on_new_strongon_destroy_strong函数记录共享指针的创建和销毁信息,在检测到泄漏时输出相关信息以确定泄漏的位置和指针。
阅读 9
0 条评论