ASIO(C ++ 11)strand.post在使用私有成员函数

时间:2017-10-25 15:56:41

标签: c++ c++11 lambda callback boost-asio

我正在学习使用ASIO库,我试图在异步读取后启动自定义处理程序。

void myConnection::start()
{
    conSocket.async_read_some(asio::buffer(conIOBuf),
        [this](const std::error_code error, std::size_t length)
        {
            std::cout << "LOG: Starting Callback\n";
            myQStrand.post(
                [this, &error]
                {
                    pushToMyQ(privateQ, error);
                });
        });
}

我已经使用gdb来调试可执行文件,但是当我运行它时,我在代码中的pushToMyQ行遇到了分段错误。我已经检查了错误和privateQ,它们都有有效的地址,当它们的成员函数被调用时它们可以工作。

myConnection是来自纯虚拟父类的子节点,用于保持命名和一些访问器在另一个类之间保持不变。 privateQ由一个管理器类保存,该类通过引用传递队列,myConnection将其作为私有成员保存。

什么可能导致分段错误发生在执行pushToMyQ的行的lambda中?

1 个答案:

答案 0 :(得分:1)

将对本地(error)的引用传递给异步任务。那不好。

异步任务还会保留this的副本,这可能在异步任务执行时不存在(我们无法知道,因为周围的代码未显示)