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

Dart列表内存疑问:原列表内存是否会被滞留或自动回收?

Dart列表重新赋值后的内存回收问题

先看你提到的前置验证代码:

final List<int> a = [1,2,3,4];
final List<int> b = a;

b[1] = 5;

print(a); // 输出 [1,5,3,4]
print(b); // 输出 [1,5,3,4]

这段代码验证了Dart中列表变量存储的是对象引用(类似指针),a和b指向同一个列表对象,所以修改b的元素会同步影响a。

再看你提出疑问的代码:

List<int> a = [1,2,3,4];
final List<int> b = List.from(a);

a = b;

核心结论

Dart是自动垃圾回收语言,当a最初指向的列表对象没有任何活跃引用时,会被自动回收,不会滞留内存。

具体分析

  1. 执行List<int> a = [1,2,3,4];时,创建了一个独立的列表对象(记为原列表),变量a持有该对象的引用。
  2. 执行final List<int> b = List.from(a);时,List.from()会创建一个全新的列表对象(记为新列表),并把原列表的元素复制进去,变量b持有这个新列表的引用。此时原列表和新列表是两个完全独立的内存块,互相没有关联。
  3. 执行a = b;时,变量a放弃了对原列表的引用,转而持有新列表的引用。

此时,原列表已经没有任何变量或其他对象持有它的引用了,Dart的垃圾回收器会在程序运行的空闲阶段自动识别并回收这块内存,不会造成内存泄漏或滞留。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 09:50:17