在缓冲区之间移动字节时出现意外结果

时间:2016-07-26 15:59:17

标签: c++ memory vector

我正在研究c ++中的一个函数,其目的是将num_bytes从一个向量移动到另一个向量。

这是我职能的相关部分

// Grab a pointer to the vector currently in use
std::vector<unsigned char> *bytes = &currentBuffer();

// Calculate un-parsed data in current vector                             
size_t num_bytes = static_cast<size_t>(currentBuffer().size() - pos_);

// Added in to test that it is working
std::cout << "Byte before: " << (*bytes)[pos_] << std::endl;

// Move num_bytes from pos_ in currentVector to [0] in otherBuffer
if (num_bytes) {                                              
   memmove(&(otherBuffer()[0]), &((*bytes)[pos_]), num_bytes);
}                                                             

// I now want to use otherBuffer as currentBuffer
bytes = &otherBuffer();                                            

// Reset size of new buffer
bytes->resize(num_bytes);                                     

// Reset position of new buffer
pos_ = 0;

// Added in to test that it is working                                   
std::cout << "Byte after: " << (*bytes)[pos_] << std::endl;

当我使用真实数据运行时,我从两个cout语句得到两个不同的结果,理想情况下,currentVector[pos_]otherVector[0]的字节值在memmove之后应该相同。

有什么可能出错的线索?我认为错误在memmove之内,但我无法弄清楚它可能是什么。

谢谢!

2 个答案:

答案 0 :(得分:4)

您需要在复制数据之前调整缓冲区的大小,否则您可能会超出其他向量的内部分配缓冲区的写入风险。

然而,使用经典的C ++方法会更好:

otherBuffer().assign(currentBuffer().begin() + pos, currentBuffer().end());

所有你需要的 - 没有调整大小,没有memmove(在这种情况下,memcpy可能会更有效率......)。

答案 1 :(得分:1)

您需要在resize()之前致电memmove(),而不是之后。

试试这个:

// Move num_bytes from pos_ in currentVector to [0] in otherBuffer
if (num_bytes) {                                              
   otherBuffer().resize(num_bytes);                                     
   memmove(&(otherBuffer()[0]), &((*bytes)[pos_]), num_bytes);
}