我正在研究c ++中的一个函数,其目的是将num_bytes
从一个向量移动到另一个向量。
这是我职能的相关部分
// Grab a pointer to the vector currently in use
std::vector<unsigned char> *bytes = ¤tBuffer();
// 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
之内,但我无法弄清楚它可能是什么。
谢谢!
答案 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);
}