我一直在使用std :: vector来存储从文件读取的一些二进制数据,然后将其序列化为通过套接字发送的数据。我为端到端功能编写了unittest,但出于意料之外的原因失败了:
std::vector<char> buf;
response->data(buf);
ASSERT(1 == buf.size());
想法是传输1个字节并接收1个字节。我实际得到的是4个字节。
基本上发生的事情是在编码和解码中使用的insert事件,将向量大小调整为bufsize * 2字节或字符。我没有在任何地方的文档中看到这一点。
unsigned long sourceLen = 1;
char source[] = { '0' };
...
std::vector<char> buf;
buf.resize(sourceLen);
buf.insert(buf.begin(), source, source + sourceLen);
ASSERT(1 == buf.size()); // Fails: buf.size() == 2.
这在解码方法的接收端再次发生,并产生四个字节的缓冲区。我通过不使用insert方法而不是实现C样式循环解决了这个问题:
buf.resize(sourceLen);
for (unsigned long i = 0; i < sourceLen; ++)
{
buf[i] = source[i];
}
ASSERT(1 == buf.size()); // Succeeds: buf.size() == 1.
那么为什么insert会以这样的方式调整向量大小,以至于你得到的数据比你开始时的数据多?哦,我确实试过这个,这解决了缓冲区大小问题,但导致没有数据被复制:
buf.resize(sourceLen);
buf.insert(buf.begin(), data, data + dataLen - 1);
ASSERT(1 == buf.size()); // Succeeds: buf.size() == 1.
ASSERT(buf[0] == source[0]); // Fails: buf[0] == ''.
一如既往,我在提交问题后想到了。插件是否保留当前内容并插入新值?即在调用insert?
之前,向量的大小调整应该将其大小调整为零字节更新
我在文档中错过了这个...
The vector is extended by inserting new elements before the element at the specified position, effectively increasing the container size by the number of elements inserted.
答案 0 :(得分:1)
std::insert()
插入新值,重新定位旧值。因此,您所描述的行为是可以预期的。您应该使用std::copy()
代替。