0
在信號/插槽系統中,您將插槽連接到信號。槽可以是任何東西,lambda對象,可能超出範圍,實例指針/成員函數指針對,函數指針。後面的插槽不能失效。如何處理不存在的插槽
我的問題是如何處理可能失效的插槽,如實例指針/成員指針對和lambda對象。可以複製lambda對象,但它們可能仍然捕獲了無效的內容(例如實例指針)。
在信號/插槽系統中,您將插槽連接到信號。槽可以是任何東西,lambda對象,可能超出範圍,實例指針/成員函數指針對,函數指針。後面的插槽不能失效。如何處理不存在的插槽
我的問題是如何處理可能失效的插槽,如實例指針/成員指針對和lambda對象。可以複製lambda對象,但它們可能仍然捕獲了無效的內容(例如實例指針)。
有創意:捕獲的值是否不再有效,你可以利用的lambda函數提前通知的mutable關鍵字(並能夠改變只讀捕獲變量)
#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,但我不確定成本是多少。