c ++ 11 lambda用法作为std :: function的委托

时间:2016-08-08 20:32:36

标签: c++ c++11 lambda callback

我有一个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实例中,如预期的那样。

我对此是否正确?这个架构上有没有内存泄漏?

1 个答案:

答案 0 :(得分:0)

你不能打电话:

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

在构造函数中或在您的应用程序代码上的任何其他初始化方法中?

此外,您的代码可以获得右值参考。

void setClickListener(OnClickListener&& callback);