【问题标题】:Copy char array into QByte Array without just passing the pointer将 char 数组复制到字节数组中,而不只是传递指针
【发布时间】:2019-03-07 09:48:21
【问题描述】:

我想将 char 数组复制到 QByteArray。

功能:

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

只是传递指针:

来自文档:构造一个使用数据数组的第一个 size 字节的 QByteArray。不复制字节。 QByteArray 将包含数据指针。

删除 tmpData 后,QByteArray 指向的值就消失了。 如何使用 qt 工具制作副本?

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

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

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

    顺便说一句,您应该考虑使用std::vector 之类的容器,而不是在代码中显式调用new/delete

    【讨论】:

      【解决方案2】:

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

      QByteArray 对字符串数据进行深拷贝。

      相对于静态QByteArray::fromRawData,声明了以下语义:

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

      因此,您应该能够通过

      获得数据的深层副本
      msg->mBuffer = QByteArray(tmpData, msg->mBufferLen);
      

      在构造msg->mBuffer 之后释放tmpData 应该没问题。

      【讨论】:

      • 就是这样!有时很容易我看不到它:D
      • @Hoehli 欢迎来到 stackoverflow,如果您找到解决问题的答案,对答案的点赞表示您对这个人的感谢
      • @Gurushant 谢谢 ;)
      • @lubgr 不客气 :)
      • 声望低于 15 点的人的点赞会被记录,但不会显示...
      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 2016-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-26
        相关资源
        最近更新 更多