Copy char array into QByte Array without just passing the pointer

时间:2018-10-02 09:16:35

标签: c++ qt

I want to copy a char array to a QByteArray.

The Function :

char *tmpData = new char[64];
.....
msg->mBuffer = QByteArray::fromRawData(tmpData,msg->mBufferLen);
....
delete[] tmpData;

is just passing the pointer:

From Documentation: Constructs a QByteArray that uses the first size bytes of the data array. The bytes are not copied. The QByteArray will contain the data pointer.

After I delete the tmpData, the values which QByteArray is pointing of are gone. How can I make a copy with qt tools?

3 个答案:

答案 0 :(得分:2)

只需使用appropriate constructor即可对数据进行深层复制...

char *tmpData = new char[64];
.....
msg->mBuffer = QByteArray(tmpData, msg->mBufferLen);
....
delete[] tmpData;

顺便说一句,您应该考虑使用诸如std::vector之类的容器,而不要在代码中进行明确的new / delete调用。

答案 1 :(得分:2)

QByteArray::QByteArray(const char*, int)构造函数文档中,我们可以看到

  

QByteArray对字符串数据进行深层复制。

与静态QByteArray::fromRawData相对,后者声明了以下语义:

  

构造一个使用数据数组的第一个大小字节的QByteArray。字节不会被复制。

因此,您应该可以通过以下方式获取数据的深层副本

msg->mBuffer = QByteArray(tmpData, msg->mBufferLen);

在构造tmpData之后重新分配msg->mBuffer应该没问题。

答案 2 :(得分:1)

一开始不应该使用裸数组。将您的代码转换为:

{
  QByteArray tmpData(64, Qt::Uninitialized);
  .....
  msg->mBuffer = tmpData;
  .....
} // tmpData gets automatically destructed here

在大多数需要tmpData的情况下,您可以使用char *