2016-08-08 56 views
0

我有一個Button類,它有一個onClick std :: function類型的字段和「setClickListener」方法設置任何lambda函數到這個std :: function字段如下:C++ 11 lambda使用作爲代表與std :: function

#include <functional> 

class Button { 

public: 

void doSomething() { 
    if(onClick) { 
     onClick(); 
    } 
} 

typedef std::function<void()> OnClickListener; 
OnClickListener onClick; 

void setClickListener(OnClickListener onClickCallBack) { 
    onClick = onClickCallBack; 
} 

}; 

在我的應用程序代碼中,我創建一個lambda函數和設置按鈕的onClick功能,如下圖所示:

#include "Button.h" 

void onAnEventOccured() { 
    button->setClickListener([this]()->void { 
     // Do something 
     memberFunction(); 
     anotherMemberFunction(); 
     // etc... 
    }); 

} 

void memberFunction() { 
    // Do some work... 
} 

void anotherMemberFunction() { 
    // Do some work... 
} 

現在,關鍵的部分是onAnEventOccured方法在應用程序的生命週期內調用多次循環並且lambda函數再次設置並且aga在。我在Visual Studio 2015上運行並將調試跟蹤點放在std :: function類的解構器上,並可以在設置setClickListener時看到它碰到跟蹤點。我想這是lambda函數的解構器,它已經被銷燬,同時如預期的那樣離開了onAnEventOccured函數的作用域和存儲在Button實例中的這個lambda的拷貝版本。

我正確嗎?這個架構有沒有內存泄漏?

+1

你的兩個問題似乎完全正交。就析構函數追蹤點而言,它可能是在將lambda又名匿名對象轉換爲std :: function對象而不是匿名對象aka lambda的析構函數時創建的臨時'std :: function'對象。 – Arunmu

+0

沒有內存泄漏,臨時對象被破壞。我無法回答你的其他問題,因爲你的第二段代碼無效,因爲你試圖在成員函數外使用'this'。 如果我明白你想要做什麼,你可能會有一個'std :: function ',這取決於一個可能被銷燬的對象,也許你可以讓你的函數對象的類型爲'std :: function '以便您可以明確地傳遞按鈕。 – EdMaster

+0

感謝您的意見。 @EdMaster,我知道你的擔憂,並且我保證「this」指針是有效的,因爲它是我當前在應用程序中的屏幕並且正在呈現。 –

回答

0

不能打電話:

button->setClickListener([this]()->void { 
     // Do something 
     memberFunction(); 
     anotherMemberFunction(); 
     // etc... 
    }); 
在構造函數或你有你的應用程序代碼的任何其他初始化方法中

此外,您的代碼可能會得到一個右值引用。

void setClickListener(OnClickListener&& callback); 
+0

感謝您的努力,但我的聽衆根據處理的事件在應用程序的生命週期中發生了變化。 –

相關問題