Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在缓冲区之间移动字节时出现意外结果 我正在研究C++中的函数,其意图是将代码> NoMyByth[从一个向量移动到另一个向量。< /P>_C++_Memory_Vector - Fatal编程技术网

在缓冲区之间移动字节时出现意外结果 我正在研究C++中的函数,其意图是将代码> NoMyByth[从一个向量移动到另一个向量。< /P>

在缓冲区之间移动字节时出现意外结果 我正在研究C++中的函数,其意图是将代码> NoMyByth[从一个向量移动到另一个向量。< /P>,c++,memory,vector,C++,Memory,Vector,这是我职能的相关部分 // 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>(curre

这是我职能的相关部分

// 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;
//获取指向当前使用的向量的指针
std::vector*字节=¤tBuffer();
//计算当前向量中未解析的数据
size\u t num\u bytes=静态\u转换(currentBuffer().size()-pos\u);
//添加到测试中,以测试它是否正常工作

std::cout您需要在
memmove()
之前而不是之后调用
resize()

试试这个:

// 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);
}                                                             

您需要在
memmove()
之前而不是之后调用
resize()

试试这个:

// 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);
}                                                             
在将数据复制到缓冲区之前,需要调整缓冲区的大小,否则可能会写入其他向量内部分配的缓冲区之外的内容

<>你最好用一个经典的C++方法:

otherBuffer().assign(currentBuffer().begin()+pos,currentBuffer().end());
您所需要的一切—无需调整大小,无需memmove(在这种情况下,memcpy可能会更有效……。

在将数据复制到缓冲区之前,需要调整缓冲区的大小,否则可能会写入其他向量内部分配的缓冲区之外的内容

<>你最好用一个经典的C++方法:

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

您所需要的一切—无需调整大小,无需memmove(在这种情况下,memcpy可能会更有效……。

您的代码可以大大简化。例如,尝试使用C++提供的工具复制一个范围:<代码>向量结果(源代码。开始)+ StaskIdEngress,源代码。code>@JimV-似乎有效:
otherBuffer()=std::vector(bytes->begin()+pos\u,bytes->begin()+pos\u+num\u字节)我有一个问题:这个新向量是否与otherBuffer()占用相同的内存位置(它返回对向量的引用)。如果没有,这有什么办法可以实现吗?你到底为什么要这样做?现在还不清楚你想做什么,也不清楚你为什么要以如此复杂的方式来做。我正在尝试最小化我必须要做的内存分配量。这些向量实际上是巨大的,理想情况下,我应该能够在创建包含向量的对象时执行类似于
vector.reserve()
的操作,以便一次抓住大量空间,然后重新使用内存。您的代码可以大大简化。例如,尝试使用C++提供的工具复制一个范围:<代码>向量结果(源代码。开始)+ StaskIdEngress,源代码。code>@JimV-似乎有效:
otherBuffer()=std::vector(bytes->begin()+pos\u,bytes->begin()+pos\u+num\u字节)我有一个问题:这个新向量是否与otherBuffer()占用相同的内存位置(它返回对向量的引用)。如果没有,这有什么办法可以实现吗?你到底为什么要这样做?现在还不清楚你想做什么,也不清楚你为什么要以如此复杂的方式来做。我正在尝试最小化我必须要做的内存分配量。这些向量实际上是巨大的,理想情况下,我应该能够做一些类似于
vector.reserve()
的事情,在创建包含向量的对象时,立即获取大量空间,然后重新使用课程的内存,你应该做的是删除所有这些代码,并用
otherBuffer()替换它。分配(…)
。当然,您应该删除所有这些代码,并将其替换为
otherBuffer()。分配(…)
。向量已调整大小-我在程序开始时执行
向量。保留(此处较大)
,以一次性分配大量空间。理想情况下,我不必再进行分配,只需重新使用最初保留的内存。@wKavey
reserve
resize
不同。您已经分配了内存,但是
向量还没有初始化这些位置。当它出现时,你可能放在那里的任何东西都会被删除。我不在乎数据被删除——这是因为内存是可重用的,我不在乎可能在那里的“旧”数据。请原谅我,如果我说的不太有意义,我可能只是没有掌握一些基本的想法,看看-有一个额外的默认参数!如果大小增加,此项将用于填充数据,在这种情况下,将覆盖您已填充的数据。另一方面,如果内部缓冲区足够大,赋值函数也不会重新分配任何内容,这是您通过
reserve
已经实现的,正如你所说。是的,我认为赋值函数正是我需要它做的-并且有逻辑确保我移动的东西的大小永远不会超过我最初保留的大小,所以我认为它不会导致任何分配发生向量已经调整大小-我做了一个
vector.reserve(这里是大的大小)
在我的程序开始时,一次分配大量空间。理想情况下,我不必再进行分配,只需重新使用最初保留的内存。@wKavey
reserve
resize
不同。您已经分配了内存,但是
向量还没有初始化这些位置。当它出现时,你可能放在那里的任何东西都会被删除。我不在乎数据被删除——这是因为内存是可重用的,我不在乎可能在那里的“旧”数据。请原谅我,如果我说的不太有意义,我可能只是没有掌握一些基本的想法,看看-有一个额外的默认参数!如果大小增加,此项将用于填充数据,在这种情况下,将覆盖您已填充的数据。另一方面,赋值函数不会重新分配