Подскажите, почему на лямбде движок крашится? Делал по образцу @AntonRassadin.

22 ответов

47 просмотров

Sound захвачен по ссылке, а ссылка оказывается битой когда таймер вызывает лямбду

Arthur-Novikov Автор вопроса

Да, может быть. Надо глубокое копирование что ли...

Arthur Novikov
Да, может быть. Надо глубокое копирование что ли.....

Просто захвати по значению ([=]). Тут у тебя только указатели и float, так что копирование ничего не стоит

Arthur-Novikov Автор вопроса
Ivan Feofanov
Просто захвати по значению ([=]). Тут у тебя тольк...

Да я пока не совсем понял что делает функтор, что такое пустая ссылка [&] и как передавать параметры в лямбде, а не в функции делегатаю...

Arthur-Novikov Автор вопроса
Ivan Feofanov
Просто захвати по значению ([=]). Тут у тебя тольк...

А, типа функтора два: [&] - по ссылке, [=] - по значению?

Arthur Novikov
А, типа функтора два: [&] - по ссылке, [=] - по зн...

Функтор это, грубо говоря, сама лямбда. [] - это Capture list, в нем перечисляются переменные, которые должны быть захвачены из области видимости, в которой объявляется лямбда. Да, захватить можно по ссылке и по значению. Желательно захватывать только те переменные, которые тебе нужны

Arthur-Novikov Автор вопроса
Ivan Feofanov
Функтор это, грубо говоря, сама лямбда. [] - это C...

Спасибо, уже понятнее, а как указать в Capture List переменные?

Arthur Novikov
Спасибо, уже понятнее, а как указать в Capture Lis...

[&VariableName, VariableName2] Такую инфу уже лего найти по первой ссылке в гугле

Arthur-Novikov Автор вопроса
Ivan Feofanov
[&VariableName, VariableName2] Такую инфу уже лег...

Тут как я понял, нужно передать ссылку на сам класс чтобы использовать переменную MainAudio. А если в функторе указывается просто [=], в этом случае функция сама вычисляет что нужно передать?

Arthur Novikov
screenshot

У тебя тут 2 ошибки: 1 - this может быть уже не валидным, когда вызовется делегат, 2 - MainAudio может так-же быть не валидным, так что это потенциально 2 креша.

Arthur-Novikov Автор вопроса
ALEX GREEN
У тебя тут 2 ошибки: 1 - this может быть уже не ва...

MainAudio в гейм инстанс подсистеме и по идее жив на протяжении всего жизненного цикла, но тем не менее можно сделать так:

Ivan Feofanov
Да, надо гасить таймеры в BeginDestroy()

Нет, не в деструкторе. Деструктор для другого создан. На EndPlay обычно лучше их прибивать.

Arthur-Novikov Автор вопроса
Ivan Feofanov
Да, надо гасить таймеры в BeginDestroy()

Накануне как раз выше обсуждали, нужны ли деструкторы для таймеров или нет... Один чел сказал что делегат собирается GC после дестроя объекта, я посмотрел по коду - уничтожается он только после истечения таймера, а если зациклен - надо руками чистить.

Arthur Novikov
screenshot MainAudio в гейм инстанс подсистеме и по идее жив ...

А еще лучше проверять валидность класса, в котором вызывается Лямбда. Просто представь, у тебя класс уже не валиден, но лямбда вызывается. Но это так, к слову. Вот пример Эпиков.

Arthur Novikov
Накануне как раз выше обсуждали, нужны ли деструкт...

Я всегда чистю всё, причем чем раньше - тем лучше. BeginDestroy намного позже вызывается, чем даже пометка флагом RF_PendingKill Я бы все привязывал бы к EndPlay, так надежнее. https://docs.unrealengine.com/4.26/en-US/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/Actors/ActorLifecycle/

Arthur-Novikov Автор вопроса
ALEX GREEN
А еще лучше проверять валидность класса, в котором...

Ну для гейминстансов и их подсистем это имеет смысл?

Arthur Novikov
Ну для гейминстансов и их подсистем это имеет смыс...

Да, смотри, то, что они живут долго не отменяет того, что при выходе из игры игрок словит креш (опять-же, теоретически). Вопрос в том, что ты не можешь знать точно, когда и что будет уничтожено. Более того, я бы не стеснялся бы проверять объекты через IsValid. Потому, что если объект уже начал уничтожаться, то if (SomeObject) пройдет, но вот далее потенциальный креш.

Arthur-Novikov Автор вопроса
ALEX GREEN
Да, смотри, то, что они живут долго не отменяет то...

Спасибо! То есть достаточно будет проверки if (IsValid(this)), а мягкие указатели использовать не обязательно.

Arthur Novikov
Спасибо! То есть достаточно будет проверки if (IsV...

Да, но, речь шла не о SoftPointers, а о том, что в Лямбдах с отложенным исполнением ты никогда не можешь гарантировать ни то, что класс, где эта лямбда будет выполнена еще валиден, ни то, что всё, что ты там используешь еще валидно. По этому да, лучше перестраховаться и проверять всё. Или глянь BindWeakLambda, тут в теории уже не нужно доп. проверок на валидность класса, но IsValid(MainAudio) - нужно.

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

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

Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
1
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Раз начали говорить про embassy, то присоединюсь со своими парой вопросов. 1) Есть ли сопоставимые аналоги для асинхронного кода в emdebbed? 2) Можно ли внутри задач embassy ...
NI_isx
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
Коллеги, может знает кто, можно ли цвет бейджа счётчика в BackendMenu менять без бубнов?
Alex Blaze
3
Всем привет. Ребята, подскажите, пожалуйста. у ботов есть ограничение на отправку сообщений - 30 сообщений в секунду, эти ограничения накладываются на все сообщения? или на со...
Artem Stormageddon
4
Коллеги, я тут для личных нужд пошел ставить MQTT сервер, пощупал mosquitto, но ужаснулся отсутствию такой банальности, как HTTP API для посмотреть список топиков. А тут что,...
Maksim Lapshin
14
У меня задача: написать брокер сообщений. Очереди и потребители. Очереди поддерживают приоритеты. Очередь отдает сообщения, только обработчикам с соответствующими характеристи...
Aleksandr Filippov
2
Карта сайта