我有一個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的拷貝版本。
我正確嗎?這個架構有沒有內存泄漏?
你的兩個問題似乎完全正交。就析構函數追蹤點而言,它可能是在將lambda又名匿名對象轉換爲std :: function對象而不是匿名對象aka lambda的析構函數時創建的臨時'std :: function'對象。 – Arunmu
沒有內存泄漏,臨時對象被破壞。我無法回答你的其他問題,因爲你的第二段代碼無效,因爲你試圖在成員函數外使用'this'。 如果我明白你想要做什麼,你可能會有一個'std :: function',這取決於一個可能被銷燬的對象,也許你可以讓你的函數對象的類型爲'std :: function '以便您可以明確地傳遞按鈕。 –
EdMaster
感謝您的意見。 @EdMaster,我知道你的擔憂,並且我保證「this」指針是有效的,因爲它是我當前在應用程序中的屏幕並且正在呈現。 –