Вызовет ли этот код утечку памяти во Flutter?

Вызовет ли этот код утечку памяти во 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;
  }
}

Я не думаю, что этот код вызовет утечку памяти, потому что и a, и b являются переменными функции, после завершения _onClickTest() a и b будут помечены как недоступные и затем переработаны.

Zhentao 11.07.2024 04:08

@Zhentao Ты прав, спасибо

Jay 11.07.2024 14:49
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Судя по вашему коду, нет, это не должно вызывать утечку памяти ни во Flutter, ни в Dart CLI. Сборщик мусора Dart предназначен для эффективной обработки циклических ссылок.

В вашем коде экземпляры a и b создаются внутри метода _onClickTest. Они будут доступны только в рамках этого метода. После завершения выполнения метода и отсутствия других ссылок на эти экземпляры они становятся доступными для сборки мусора.

Очень понятное объяснение, спасибо.

Jay 11.07.2024 15:13

Утечки памяти — распространенная ошибка в программировании, особенно при использовании языков, в которых нет встроенной автоматической сборки мусора, таких как C и C++. Википедия

Такое случается редко при использовании языка, поддерживающего сборку мусора, к счастью, в dart.

все ссылочные переменные, объявленные в вашем коде a, b, создаются тогда и только тогда, когда кнопка нажата, как только кнопка нажата, вызывается метод обратного вызова и создаются эти ссылки.

После завершения метода выделенное пространство в памяти освобождается путем отмены ссылок на a и b, это ответственность сборщика мусора.

Так что нет, ваш код не будет потреблять или злоупотреблять памятью, что приведет к утечке памяти.

Очень понятное объяснение, спасибо.

Jay 11.07.2024 15:13

Другие вопросы по теме