gpt4 book ai didi

sockets - 在ASIO Reactor中使用Lambda的Auto vs Typedef

转载 作者:行者123 更新时间:2023-12-03 12:00:18 27 4
gpt4 key购买 nike

我有一些这样的代码:

typedef std::function<void (void)> const& basic_callback_t;

void Receive::async_basic(fragmenting_socket& socket, const ID id, basic_callback_t fn)
{
int buffer[1024];
socket.async_receive(buffer, sizeof(buffer), [&](const boost::system::error_code& ec, size_t bytes)
{
....

if (fn)
{
fn();
} else
{
THROW("async_receive callback: Could not call fn()");
}
});

}

并且 socket.async_receive()正在调用 boost::asio::ip::udp::socket::async_receive_from()
我用以下代码调用 async_basic():
boost::asio::io_service m_service;
fragmenting_socket m_camera_socket { m_service, 0, 0 };

std::thread service_thread([&] { m_service.run(); });

bool finished = false;
// NOTE: this is weird, when I correctly define f as basic_callback_t, it works.
// when I use "auto f" or keep the lambda anonymous, then it gets invalidated inside the asio reactor
protocol::basic_callback_t f = [&finished] ()
{
finished = true;
};

protocol::Receive::async_basic(m_camera_socket, protocol::ID::QUERY, f);

上面的代码似乎可以正常工作,并且 f被调用并完成设置为true。但是,如果我将匿名lambda传递给 async_basic或将 f声明为
auto f = [&] () ....

然后,asio react 器会将 fn中的 async_receive视为超出范围,并调用 THROW()语句。有谁知道为什么会这样?对于为什么将 f声明为 protocol::basic_callback_t起作用而将其声明为 auto却不起作用,我实际上感到困惑。在这两种情况下,仿函数都放置在堆栈上,并且应该在 m_service运行所在的线程中超出范围。

我正在使用带有-std = c++ 11标志集和-fPIC的g++ 4.8.2进行编译。

干杯

最佳答案

在这两种变体中,您都有Undefined Behaviour

void Receive::async_basic(fragmenting_socket& socket, const ID id, basic_callback_t fn)
{
int buffer[1024];
socket.async_receive(buffer, sizeof(buffer), [&](const boost::system::error_code& ec, size_t bytes)
{
if (fn) {
fn();
} else {
THROW("async_receive callback: Could not call fn()");
}
});

async_receive的调用通过引用捕获了 fn。但是,一旦 async_basic返回,该引用就无效。

实际上,这也适用于buffer[] : buffer超出范围,因此 async_receive写入了它时,您将具有未定义的行为。

UB的本质是任何事情都会发生,这解释了为什么您似乎看到了不同的行为。

关于sockets - 在ASIO Reactor中使用Lambda的Auto vs Typedef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29693641/

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