169 похожих чатов

В func1() запускается Timer.periodic после его запуска функция завершается Но должная уничтожиться

перемнная msg, но нет, она продолждает эксплуатироваться ТамеромПереодик

А что если полсле myTimer.cancel() она останеться в памяти? Ведь у меня такие таймеры периодически запускаются и завершаются

18 ответов

22 просмотра

gc потом ее уберет

HhHhH- Автор вопроса
Kirill Bubochkin
gc потом ее уберет

как проверить что умерла она?

Посмотреть на код. Если надо прям убедиться – профилировать память.

HhHhH- Автор вопроса
Kirill Bubochkin
Посмотреть на код. Если надо прям убедиться – проф...

как глядя на код понять что перменная ещё существует

HhHhH
как глядя на код понять что перменная ещё существу...

Почитайте про замыкания. Колбэк таймера захватывает эту переменную. После того, как таймер остановится, колбэк будет не нужен, поэтому gc может всё собрать. Понятно, что в сложных случаях всё будет сложнее. Ну там уже и память иногда приходится профилировать, и утечки ловить.

HhHhH- Автор вопроса
Kirill Bubochkin
Почитайте про замыкания. Колбэк таймера захватывае...

Может глобальную переменную завести чтобы вдруг случайно не насоздавал тысячи таких переменных. Если тысячи раз вызывается func1

HhHhH
Может глобальную переменную завести чтобы вдруг сл...

Создавать глобальные переменные "на всякий случай" – очень плохая практика. Надо понимать, как работает код, а не делать на всякий случай. В конкретном случае со строкой, это вообще смешно. На каждый вызов build метода создаются инстансы виджетов, а это может происходить 120 раз в секунду. Представляете, сколько новых инстансов создается каждую секунду?

Кириллов Максим (Евстегней Чачлык)
Видишь cancel() значит переменная умерла

ну нет, на основании только этого делать выводы не стоит

Переменные уничтожаются в тот момент когда перестают использоваться. Жизненный цикл переменной не всегда связан с жизненным циклом функции

HhHhH- Автор вопроса
Royal Cat
Переменные уничтожаются в тот момент когда переста...

Ну 10сек в периодике не используется. Но не уничтожается

Это уже сложнее. Я не готов утверждать как конкретно работает очистка переменных в дарте, исходники не смотрел. Насколько помню большая часть переменных будет удалятся через счетчик ссылок, а локальные переменные функции все таки будут создаватся на стеке. В любом случае в тот момент когда с переменной пропали все ссылки правильно считать что её нет, внутренний алгоритм работы gc не так важен

Royal Cat
Это уже сложнее. Я не готов утверждать как конкрет...

> В любом случае в тот момент когда с переменной пропали все ссылки правильно считать что её нет Правильно для чего? С точки зрения потребления памяти, память всё еще занята. С т.з. того, что к ней уже нельзя обратиться – ну да.

HhHhH
как проверить что умерла она?

Есть финалайзеры) но никто не гарантирует что GC избавиться от мертвой памяти, так как у системы мб достаточно места чтобы GC лишний раз не отрабатывал

HhHhH- Автор вопроса

Вот вот. Чувствовал подвох

HhHhH
Вот вот. Чувствовал подвох

Ну если у тебя эмулятор ты можешь эмулировать нехватку памяти... Другое дело что если вовсе память кончится то при работе финалайзеры прила может упасть из за того что не сможет выделить память (тоже самое при перехвате проблемы StackOverflow, мы не можем обработать ошибку, так как стек переполнен)))

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Карта сайта