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

22 ответов

30 просмотров

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

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

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

так это может кто что знает или использует что-то как макбук только не макбук? на 13…14 дюймов
Michael
9
Кто-нибудь знает почему SPM клонирует репо целиком? Некоторые репы просто огромные, как та же swift-syntax которая нужна для использования макросов. Сначала подумал, что это...
iMike
6
Всем привет) Я попробовал турбо роутер октябрьский. Вроде доволен, но возникла проблемка) Бутстраповские модалки плодят .modal-backdrop элементы Если модалка открыта, должне...
Виталий
3
Так а кто может спарсить всех участников чата? Идишники
Magic
18
да пофиг на капчу зашел в чат и молчишь при этом ты нонейм? пошел вон
Magic
17
кто что использовал парсить ексель ? неохота гуглить и пробовать 🙃
Oleh Nerzh
7
у меня вопрос, а айМайк отец пятерых детей или отец пятого свифта?
Karl {🌪️}{🐊} Shinobi
5
Гайз, а как отправлять с вейпора пуши на андроид? ) Меня вот осенило )))
Serg
11
Как удалить health check в Consul? Казалось бы, это должно быть не сложно, но я не могу найти в документации ничего про это, только про добавление service с health check "в н...
Roman
2
Добрый день! Подскажите, пожалуйста: какими компетенциями нужно обладать, чтобы претендовать на работу эрланг (отдельная благодарность, если про элексир тоже подскажете) разр...
via ☸️ led
1
Карта сайта