c++ - 通过引用传递错误:const boost::system::error_code error

标签 c++ boost boost-asio

我想用我自己的错误代码调用完成处理程序,但参数的签名是:

const boost::system::error_code& err

而且我担心我构造的 error_code 的生命周期,尤其是与异步处理程序、链式处理程序、io_service.post 以及对超出范围的基于堆栈的错误代码的引用的粗心传播有关。

我可以尝试这样的事情:

const boost::system::error_code err = 
    boost::system::errc::make_error_code(boost::system::errc::bad_message);
handler(&err);

但不按值传递似乎有点可怕;特别是如果我想使用 io_service.post

像这样使用 lambda 的方法是最好的吗? (我也可能在 lambda 中出错)

const boost::system::error_code err = 
    boost::system::errc::make_error_code(boost::system::errc::bad_message);
io_service.post([error](){ handler(&err); }

这安全吗?无泄漏?

handler(boost::system::errc::make_error_code(boost::system::errc::bad_message));

最佳答案

即使处理程序函数签名采用 const ref error_code,任何存储错误代码的处理程序对象都应该存储它的拷贝。如果你不这样做,除了最琐碎的基于 asio 的程序之外,你最终会(正如你所担心的那样)在任何东西中遇到生命周期问题。

C++ 函数对象实际上默认以这种方式运行 - 您必须故意将 reference_wrappers 传递给它们以让它们存储引用,这是有充分理由的。推理传递拷贝的程序要容易得多。在多线程程序中,更频繁地传递拷贝往往会提供更好的性能,因为无需担心互斥锁争用或缓存刷新。

此外,error_code 对象非常轻量级。它们按值复制比按引用使用更快。

所以,总而言之,不要这样做:

const boost::system::error_code err = 
  boost::system::errc::make_error_code(boost::system::errc::bad_message);
handler(&err);

这样做:

handler(make_error_code(boost::system::errc::bad_message));

不要这样做:

const boost::system::error_code err = 
boost::system::errc::make_error_code(boost::system::errc::bad_message);
io_service.post([error](){ handler(&err); }

这样做:

auto err = make_error_code(boost::system::errc::bad_message);
io_service.post([err](){ handler(err); }

或者这个:

io_service.post(std::bind(hander, make_error_code(boost::system::errc::bad_message));

或者这个:

io_service.post([] {
    handler(make_error_code(boost::system::errc::bad_message)); 
});

关于c++ - 通过引用传递错误:const boost::system::error_code error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35864942/

相关文章:

c++ - mingw-w64-v2.0.6.tar.gz - 定义环境变量路径

c++ - 为什么 boost::msm::front::state_machine 的转换表最多只能支持 10 个状态?

c++ - 使用 boost locale 将 wchar_t 转换为 char

c++ - 是否允许递归 boost spirit 语法?

c++ - 如何防止截止时间计时器调用已删除类中的函数?

c++ - 如何在可变参数包中扩展 vector 或数组?

c++ - 比较 std::tuple_element 和 decltype(std::get) 时,std::is_same 返回 false

boost address_v4::from_string() 崩溃了

sockets - 在 Android 中我应该选择 Boost Asio 还是 Async Socket 线程?

C++ 对象生命周期优化