В системе сигнал / слот вы подключаете слот к сигналу. Слот может быть чем угодно, лямбда-объектом, который может выйти за пределы области видимости, пара указатель экземпляра / указатель на функцию-член, указатель на функцию. Последние слоты не могут быть признаны недействительными.
Мой вопрос заключается в том, как обращаться со слотами, которые могут быть признаны недействительными, такими как пары указатель экземпляра / указатель на член и объекты лямбда. Можно было бы копировать лямбда-объекты, но они все еще могли захватить что-то, что было признано недействительным (например, указатель экземпляра).
Будьте изобретательны: вы можете использовать изменчивый Ключевое слово для лямбда-функции, которая должна быть заранее уведомлена о том, что захваченное значение больше не является действительным (и может изменять захваченные переменные только для чтения)
#include <iostream>
using namespace std;
int main() {
int *num = new int(0x90);
auto lambda = [=] (bool ptrHasChanged = false) mutable { if(ptrHasChanged) num = new int(0x1); cout << *num << endl; if(ptrHasChanged) delete num;};
lambda();
delete num;
lambda(true);
return 0;
}
если вы захватываете объекты класса и используете их переменные-члены (всегда по ссылке, так как вы захватываете this
указатель по значению) это ваша ответственность иметь дело с областями действия.
Более простое решение — восстанавливать лямбду каждый раз, когда вам это нужно, хотя я не уверен, сколько это будет стоить.
Других решений пока нет …