C++ 按引用传递-C++;

C++ 按引用传递-C++;,c++,boost,vector,boost-asio,C++,Boost,Vector,Boost Asio,我正在为我的应用程序使用Boost库(Boost_1_53_0)。感兴趣的区域是通过UDP发送消息的模块。查看下面的代码部分(我去掉了不必要的代码部分,它们不会影响功能) intsend() { . . . std::向量bufs; 书面信息(bufs); /*如果我注释掉writeMessage并填充变量 *bufs以同样的方式在writeMessage中填充, *一切正常*/ udpSocket.send_to(bufs,端点); } void writeMessage(std::vecto

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

intsend()
{
.
.
.
std::向量bufs;
书面信息(bufs);
/*如果我注释掉writeMessage并填充变量
*bufs以同样的方式在writeMessage中填充,
*一切正常*/
udpSocket.send_to(bufs,端点);
}
void writeMessage(std::vector和bufs)
{
/*填充数据*/
bufs.push_back(boost::asio::const_buffer(data1,sizeof(data1));
bufs.push_back(boost::asio::const_缓冲区(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位编译的。

最常见的陷阱是忘记
缓冲区
(或
常量缓冲区
)函数(向下滚动上面的页面以查看解释和示例)-它们只是将其调整为
可变缓冲序列
(或)概念。这意味着缓冲区必须超过异步操作


为什么您的程序使用其他编译器/编译器标志/boost version/等?这只是运气的问题。您的
数据1
<在函数堆栈框架内(在
RBP
下),分配了
char
数组的code>dataN。当
writeMessage
函数退出时,其堆栈帧被释放。随后的函数调用将在
writeMessage
所处的位置分配堆栈帧。但只要它们不使用
data1
的堆栈地址<代码>数据n,旧数据可能会保持不变。稍有不同的编译器标志或函数实现将改变情况。

您是否使用了调试器并设置了断点以查看数据损坏的位置?你的传递引用在我看来当然不错。你认为有什么会使
数据1,2..n
设置消息中的值/大小不正确吗。还可以尝试发送一个数据buf,看看是否正确,然后从那里获取。@us2012我使用了gdb并检查了内存位置,2个字节已损坏,我正在发送一条22字节的消息,第9、10个字节已损坏。但即使这样,从系统发出的消息也完全不同。@ArunR我发送了一个2字节的块,但即使这样,发送的消息也是错误的。“data1”…“datan”是什么?您是否正确管理这些缓冲区的使用寿命?
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)));
}