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

Flutter及Dart CLI中双向引用代码是否会引发内存泄漏?

关于Dart/Flutter中双向引用的内存回收问题

你的代码里A和B形成了双向引用,但不管是在Flutter还是Dart CLI环境下,都不会造成内存泄漏,具体原因如下:

Dart/Flutter的GC核心逻辑

Dart采用的是基于可达性分析的垃圾回收机制,和OC、Swift的引用计数机制完全不同。引用计数会被循环引用卡住,但可达性GC是从根节点(比如全局变量、当前执行栈中的变量)出发,标记所有能被访问到的对象;那些无法被根节点触及的对象,不管内部有没有循环引用,都会被判定为可回收对象。

你的代码场景分析

在_onClickTest方法执行完毕后,局部变量a和b会从当前栈帧中移除,此时这两个对象没有任何外部可达的引用路径,完全处于“不可达”状态。不管是Flutter VM还是Dart CLI的VM,都会在GC触发时将它们回收。

你通过DevTools观察到的疑似回收结果是准确的——没有任何强引用会留住这两个对象。

附你的代码:

class A {
  late B b;
}

class B {
  final A a;
  B({required this.a});
}

class MyWidget extends StatelessWidget {
  const MyWidget({super.key});

  @override
  Widget build(BuildContext context) {
    return TextButton(
        onPressed: () {
          _onClickTest();
        },
        child: const Text('Test'));
  }

  void _onClickTest() {
    final a = A();
    final b = B(a: a);
    a.b = b;
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 05:24:52