【问题标题】:how to deal with slots that are gone如何处理已消失的插槽
【发布时间】:2014-05-22 05:12:41
【问题描述】:

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

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

【问题讨论】:

    标签: c++ signals signals-slots slots


    【解决方案1】:

    有创意:您可以利用 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,尽管我不确定成本是多少。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-01
      • 2021-04-29
      • 1970-01-01
      • 2021-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-28
      相关资源
      最近更新 更多