如何处理已经消失的插槽

时间:2014-04-09 07:01:52

标签: c++ signals signals-slots slots

在信号/插槽系统中,您将插槽连接到信号。槽可以是任何东西,lambda对象,可能超出范围,实例指针/成员函数指针对,函数指针。后一个插槽不能无效。

我的问题是如何处理可能失效的插槽,例如实例指针/成员指针对和lambda对象。可以复制lambda对象,但是它们可能仍然捕获了无效的东西(例如实例指针)。

1 个答案:

答案 0 :(得分:0)

要有创意:您可以利用mutable关键字为lambda函数提前通知捕获的值是否不再有效(并且能够更改只读捕获的变量)

#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指针,总是通过引用),你有责任处理范围。

更简单的解决方案是每次需要时重新生成lambda,虽然我不确定成本是多少。