Вызовет ли этот код утечку памяти во Flutter?
Классы A и B ссылаются друг на друга:
В VM
в Flutter
есть GC
, что отличается от других языков, которые я изучал, например OC
или Swift
.
Я наблюдал с помощью инструментов разработки и обнаружил, что это похоже на GC, но я не знаком с инструментами разработки и не уверен, что то, что я заметил, правильно.
Другой вопрос: вызовет ли этот код утечки памяти в dart cli
?
Спасибо!
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;
}
}
@Zhentao Ты прав, спасибо
Судя по вашему коду, нет, это не должно вызывать утечку памяти ни во Flutter, ни в Dart CLI. Сборщик мусора Dart предназначен для эффективной обработки циклических ссылок.
В вашем коде экземпляры a и b создаются внутри метода _onClickTest. Они будут доступны только в рамках этого метода. После завершения выполнения метода и отсутствия других ссылок на эти экземпляры они становятся доступными для сборки мусора.
Очень понятное объяснение, спасибо.
Утечки памяти — распространенная ошибка в программировании, особенно при использовании языков, в которых нет встроенной автоматической сборки мусора, таких как C и C++. Википедия
Такое случается редко при использовании языка, поддерживающего сборку мусора, к счастью, в dart.
все ссылочные переменные, объявленные в вашем коде a
, b
, создаются тогда и только тогда, когда кнопка нажата, как только кнопка нажата, вызывается метод обратного вызова и создаются эти ссылки.
После завершения метода выделенное пространство в памяти освобождается путем отмены ссылок на a
и b
, это ответственность сборщика мусора.
Так что нет, ваш код не будет потреблять или злоупотреблять памятью, что приведет к утечке памяти.
Очень понятное объяснение, спасибо.
Я не думаю, что этот код вызовет утечку памяти, потому что и a, и b являются переменными функции, после завершения
_onClickTest()
a и b будут помечены как недоступные и затем переработаны.