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
相关产品推荐
相关产品推荐

