析构——循环引用
有如下结构:
A包含B的引用,B包含C的引用,他们都通过引用计数的方式实现析构。
若此时,释放A,A会减少对B的引用计数,但由于C的引用,B的计数不可能降为0,于是B不会自动释放,C也不会去自动释放。
这样的结果是A释放了,但只要程序还存活,B、C循环引用,依旧不会被释放,只有当程序整个退出时,才会被系统回收全部资源。
破解的方法:
一、在析构A时,强制析构掉B,这样会触发C的计数减少,从而在释放B时C能得到释放。
二、直接避免逆向引用,仅使用自上而下的引用,自下而上的引用变更为使用记录ID的方式,或者仅在调试时使用宏开启该功能。