【症状】
销毁程序中所有rp对象后,MemPoolImpl中的mAllocatedCount变成了-1(应该为0)。
【诊断】
应该是多调用了一个MemPoolImpl->freeMemNode(...)函数。allocMemNode()和freeMemNode()是成对调用的。
以为是某个对象在new_rp时为A对象,而使用时作为了B对象。其中B类内部含有某个rp<T>的成员变量。所以在析构rp时,对多调用了rp<T>的析构,从而多调用了一个freeMemNode()函数,使得mAllcatedCount成了-1。
【原因】
真正原因是在对象T的构造函数中使用了jh_this_rp,它使得MemNode中引用计数+1,而单jh_this_rp在构造函数中析构时,又使引用计数-1,变为了0,从而触发了freeMemNode(),并调用了T的析构函数。
【解决】
在Allocator中,创建MemNode后,主动给引用计数+1,再调用T的构造函数。此时即使jh_this_rp析构,由于引用计数不为0,不会触发freeMemNode()。T对象构造函数执行完毕后,再减少引用计数(使用decRef_notDisconstruct()),使引用计数为0却不会触发freeMemNode()。
【代码】