lambda延长生存期
lambda作为类成员时,外部获取lambda后,在lambda作用于结束后,lambda会析构,
此时如果还有外部函数对象想继续使用lambda,本文提供了一种方法,可以通过延长lambda生存周期
主要方式是:
1:类继承enable_shared_from_this
2:类中通过self=shared_from_this() 将指针再包裹一次,增加引用计数
示例代码
#include <functional>
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
struct TCPSession: public enable_shared_from_this<TCPSession>{
int data;
TCPSession(int d):data(d)
{
}
TCPSession(const TCPSession& rhs):data(rhs.data){
cout<<"TCPSession copy ctor"<<endl;
}
void process() const{
cout<<"process:"<<data<<endl;
}
auto getLambda(){
shared_ptr<TCPSession> self=shared_from_this();
auto lam=[this,self]() {
this->process();
cout<<data<<endl;
};
return lam;
}
~TCPSession(){
cout<<"~TCPSession"<<endl;
}
};
int main(){
std::function<void(void)> func;
{
shared_ptr<TCPSession> tsObj=make_shared<TCPSession>(100);
func=tsObj->getLambda();
cout<<tsObj->data++<<endl;
func();
cout<<tsObj->data++<<endl;
cout<<"引用计数:"<<tsObj.use_count()<<endl;
}
func();
}
编译及结果
kongcb@tcu-pc:~/testcode/lambda$ g++ lambda_capture_this_share.cpp -o lambda_capture_this_share
kongcb@tcu-pc:~/testcode/lambda$ ./lambda_capture_this_share
100
process:101
101
101
引用计数:2
process:102
102
~TCPSession //最后到这里才析构
错误分析
auto getLambda(){
auto lam=[ this]() mutable{
this->process();
this->data++;
};
return lam;
}