我有一个Button类,它有一个onClick std :: function typed字段和" setClickListener" method将任何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函数。我在Visual Studio 2015上运行并将调试跟踪点放在std :: function类的解构器上,并且可以在设置setClickListener时看到它到达tracepoint。我想这是lambda函数的解构函数,它已被破坏,同时保留了onAnEventOccured函数的范围,并且该lambda的副本版本存储在Button实例中,如预期的那样。
我对此是否正确?这个架构上有没有内存泄漏?
答案 0 :(得分:0)
你不能打电话:
button->setClickListener([this]()->void {
// Do something
memberFunction();
anotherMemberFunction();
// etc...
});
在构造函数中或在您的应用程序代码上的任何其他初始化方法中?
此外,您的代码可以获得右值参考。
void setClickListener(OnClickListener&& callback);