You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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完成销毁,因此析构函数可以正常调用。
解决方案(若要求全程使用shared_ptr)

如果不使用weak_ptr打破循环,需要在主函数退出前主动断开强引用闭环,例如手动执行如下任意一行代码即可:

mM->setExampleComponent(nullptr);
// 或者
eC->setMediator(nullptr);

内容的提问来源于stack exchange,提问作者Talel BELHAJSALEM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 18:39:02