как бороться с пропавшими слотами

В системе сигнал / слот вы подключаете слот к сигналу. Слот может быть чем угодно, лямбда-объектом, который может выйти за пределы области видимости, пара указатель экземпляра / указатель на функцию-член, указатель на функцию. Последние слоты не могут быть признаны недействительными.

Мой вопрос заключается в том, как обращаться со слотами, которые могут быть признаны недействительными, такими как пары указатель экземпляра / указатель на член и объекты лямбда. Можно было бы копировать лямбда-объекты, но они все еще могли захватить что-то, что было признано недействительным (например, указатель экземпляра).

0

Решение

Будьте изобретательны: вы можете использовать изменчивый Ключевое слово для лямбда-функции, которая должна быть заранее уведомлена о том, что захваченное значение больше не является действительным (и может изменять захваченные переменные только для чтения)

#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 указатель по значению) это ваша ответственность иметь дело с областями действия.

Более простое решение — восстанавливать лямбду каждый раз, когда вам это нужно, хотя я не уверен, сколько это будет стоить.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]