C++ 复制将前3个字节设置为0后删除原始数组指针
以下程序一直工作到缓冲区大小大约为135。 如果缓冲区变大,前3.5个字节将打印为0。 (在MKR1000 arduino上) 我做错了什么? std::vector在这里更合适吗 谢谢 在这些操作之后,C++ 复制将前3个字节设置为0后删除原始数组指针,c++,arrays,pointers,arduino,delete-operator,C++,Arrays,Pointers,Arduino,Delete Operator,以下程序一直工作到缓冲区大小大约为135。 如果缓冲区变大,前3.5个字节将打印为0。 (在MKR1000 arduino上) 我做错了什么? std::vector在这里更合适吗 谢谢 在这些操作之后,bufferOut是一个无效指针,因为它用来指向的对象已被销毁。这本身并不会导致任何未定义的行为,但您可能只是未能创建,而问题实际上是由于您稍后使用了无效指针造成的 std::vector在这里更合适吗 很可能是的。删除[]临时缓冲区2-您认为让缓冲区指向什么?您刚刚删除了指针后面的内存,只在前
bufferOut
是一个无效指针,因为它用来指向的对象已被销毁。这本身并不会导致任何未定义的行为,但您可能只是未能创建,而问题实际上是由于您稍后使用了无效指针造成的
std::vector在这里更合适吗
很可能是的。
删除[]临时缓冲区2代码>-您认为让缓冲区指向什么?您刚刚删除了指针后面的内存,只在前面分配了两行,并在前面一行存储在bufferOut
中,使其悬空。任何调用未定义行为的进一步取消引用。是的,std::vector
几乎总是更适合手动内存管理。我们需要实际的、完整的代码。从目前的情况看,这个代码没有意义。在分配和解除分配之间不使用内存,那么为什么要首先分配它呢?另外,第一个函数与第二个函数有什么关系?在copy将前3个字节设置为0后删除原始数组指针-没有合法的方法可以找到这一点。
uint8_t* bufferOut;
size_t sizeOut;
void SendMessage()
{
fillBuffer();
sendBuffer();
}
void fillBuffer()
{
sizeOut = 12; //just an example
uint8_t* tempBuffer2 = new uint8_t[sizeOut];
bufferOut = tempBuffer2;
delete[] tempBuffer2;
}
void sendBuffer()
{
Serial.Write(bufferOut, sizeOut);
}
bufferOut = tempBuffer2;
delete[] tempBuffer2;