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

22 ответов

70 просмотров

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) - нужно.

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

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

Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
5
А в каком формате фреймы? Сам формат сейчас придумываешь, или что-то готовое нужно распарсить?
Okhsunrog
5
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
Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Раз начали говорить про embassy, то присоединюсь со своими парой вопросов. 1) Есть ли сопоставимые аналоги для асинхронного кода в emdebbed? 2) Можно ли внутри задач embassy ...
NI_isx
6
сделал сайт, прикрутил в боте сайт, и виджет логина. как автоматически логинить пользователя в аккаунт(телеграм), при входе с бота?
Александра Чернивецкая
5
Карта сайта