gpt4 book ai didi

c++ - 执行完成后释放 C++ lambda 的内存

转载 作者:行者123 更新时间:2023-12-05 08:45:59 35 4
gpt4 key购买 nike

我正在用 C++ 编写一个网络函数,后台线程中的 HTTP 请求,在接收 HTTP 数据时使用 lambda 回调。但我不知道如何释放 lambda,希望得到一些帮助。

void foo()
{
// the `func` must be a heap variable for asynchronously.
auto func = new auto ([&](std::string response){
printf("recv data: %s", response.c_str());
});

std::thread t([&]{
sleep(2); // simulate a HTTP request.
std::string ret = "http result";
(*func)(ret);
});
t.detach();

// The foo function was finished. bug `func` lambda still in memory ?
}

int main()
{
foo();
getchar(); // simulate UI Event Loop.
return 0;
}

最佳答案

您可以在 lambda 中捕获 lambda:

void foo()
{
std::thread t(
[func = [](std::string response) {
printf("recv data: %s", response.c_str());
}](){
sleep(2); // simulate a HTTP request.
std::string ret = "http result";
func(ret);
});
t.detach();
// The foo function was finished. bug `func` lambda still in memory ?
}

或者如果它应该被共享,您可以通过 shared_ptr 使用共享所有权语义,然后按值将其捕获到 lambda 中以增加其引用计数:

void foo()
{
auto lambda = [](std::string response){
printf("recv data: %s", response.c_str());
};

std::shared_ptr<decltype(lambda)> func{
std::make_shared<decltype(lambda)>(std::move(lambda))
};

std::thread t([func]{
sleep(2); // simulate a HTTP request.
std::string ret = "http result";
(*func)(ret);
});
t.detach();
}

对于非捕获的lambdas,我们可以把它变成一个函数指针,并不关心

void foo()
{
auto func_{
[](std::string response){
printf("recv data: %s", response.c_str());
}
};

std::thread t([func=+func_]{ //note the + to turn lambda into function pointer
sleep(2); // simulate a HTTP request.
std::string ret = "http result";
(*func)(ret);
});
t.detach();

关于c++ - 执行完成后释放 C++ lambda 的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70737686/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com