通过引用传递 - C ++中的const_buffer对象

时间:2013-09-20 20:22:11

标签: c++ boost vector boost-asio

我正在为我的应用程序使用Boost库(boost_1_53_0)。感兴趣的区域是通过UDP发送消息的模块。查看下面的代码部分(我已经删除了不会影响功能的不必要的代码部分)。

int send()
{
    .
    .
    .
    std::vector<boost::asio::const_buffer> bufs;

    writeMessage(bufs);

    /* If I comment out writeMessage and fill variable
     * bufs the same way its populated in writeMessage,
     * things work */

    udpSocket.send_to(bufs, endPoint);
}

void writeMessage(std::vector<boost::asio::const_buffer>& bufs)
{
    /* Populate data..... */

    bufs.push_back(boost::asio::const_buffer(data1, sizeof(data1)));
    bufs.push_back(boost::asio::const_buffer(data2, sizeof(data2)));
    .
    .
    .
    bufs.push_back(boost::asio::const_buffer(datan, sizeof(datan)));
}

我正在使用wireshark检查从系统发出的消息。由于某种原因,正在向系统发送不正确的数据。通过变量bufs的引用是否正确?同一段代码适用于较旧的g ++和Boost版本。

如果我注释掉writeMessage并在send()函数中手动填充向量bufs,那么事情就好了。只有当我使用函数writeMessage()时,数据才会被破坏。

我最近升级到g ++ 4.6.3和Boost 1_53_0并看到了这个问题。我正在使用Ubuntu 64位机器。所有库都编译为64位。

1 个答案:

答案 0 :(得分:1)

最常见的陷阱是忘记buffer(或const_buffer)函数do not copy the underlying buffer(向上滚动页面以查看解释和示例) - 它们只是将其调整为{{ 1}}(或ConstBufferSequence)概念。这意味着缓冲区必须比异步操作更长。

为什么你的程序用于处理其他一些编译器/编译器标志/ boost版本/等?这只是运气问题。您的MutableBufferSequence data1数组dataN已在函数堆栈框架内(char下)分配on the call stack。当RBP函数退出时,其堆栈帧将被释放。后续函数调用将在writeMessage所在的同一位置分配堆栈帧。但只要他们不使用writeMessage ... data1的堆栈地址,旧数据就可以保持不变。略有不同的编译器标志或函数实现将改变图片。