使用shared_ptr实现中介者模式时派生类析构函数未调用
问题原因
这个问题是shared_ptr的循环引用特性导致的,具体逻辑如下:
- 你的代码中
ExampleMediator实例通过成员变量eC持有ExampleComponent实例的shared_ptr,同时ExampleComponent实例通过继承来的基类成员m持有ExampleMediator实例的shared_ptr,两者形成了双向的强引用闭环。 - 主函数运行结束后,栈上的两个局部智能指针
mM、eC销毁,只会将两个实例的引用计数各减1:此时ExampleMediator实例的引用计数还剩1(被组件对象持有),ExampleComponent实例的引用计数也还剩1(被中介者对象持有),引用计数均无法降到0,因此两个对象都不会被自动释放,析构函数自然不会被调用。 - 当你移除
mM->setExampleComponent(eC);代码行时,上述闭环不存在:主函数退出时eC的引用计数先降到0被销毁,组件销毁时会自动释放持有的中介者引用,让中介者的引用计数也降到0完成销毁,因此析构函数可以正常调用。
如果不使用weak_ptr打破循环,需要在主函数退出前主动断开强引用闭环,例如手动执行如下任意一行代码即可:
mM->setExampleComponent(nullptr); // 或者 eC->setMediator(nullptr);
内容的提问来源于stack exchange,提问作者Talel BELHAJSALEM
相关产品推荐
相关产品推荐

