小心 QByteArray

浅拷贝不拷贝对象指向的内存
深拷贝拷贝对象指向的内存
写个报文格式, 转成QByteArray发现的问题, 之前从来没有验证, 都是直接用.

    int size = 0;
    uint8_t* buf = Q_NULLPTR;
    SeerData* seer_data = Q_NULLPTR;
    buf = new uint8_t[sizeof(SeerHeader)];//16个单字节数组
    seer_data = (SeerData*)buf;//转化为包头
    QByteArray sendByteArrayData = QByteArray::fromRawData((char*)seer_data, size);
    QByteArray copyB;
    //深拷贝赋值
    for(int i = 0; i<sendByteArrayData.size(); ++i){
        copyB.append(sendByteArrayData.at(i));
    }
    SCDebug<<"sendByteArrayData.toHex1:"<<QString(sendByteArrayData.toHex());
    delete[] buf;
    SCDebug<<"sendByteArrayData.toHex2:"<<QString(sendByteArrayData.toHex());
    SCDebug<<"copyB.toHex:"<<QString(copyB.toHex());

我们发现使用QByteArray::fromRawData只是浅拷贝, 需要使用for给新的的QByteArray赋值才会拷贝内存

[Debug][ ..\..\..\..\Roboshop-Pro\Libs\CLibs\RoNetwork\RobotTcp\BlockTcp.cpp ]$ 0 $ [ 208 ][ BlockTcp::getSendData2 ]: sendByteArrayData.toHex1: 5a0100000000000005780578cdcdcdcd
[Debug][ ..\..\..\..\Roboshop-Pro\Libs\CLibs\RoNetwork\RobotTcp\BlockTcp.cpp ]$ 0 $ [ 210 ][ BlockTcp::getSendData2 ]: sendByteArrayData.toHex2: eefeeefeeefeeefeeefeeefeeefeeefe
[Debug][ ..\..\..\..\Roboshop-Pro\Libs\CLibs\RoNetwork\RobotTcp\BlockTcp.cpp ]$ 0 $ [ 211 ][ BlockTcp::getSendData2 ]: copyB.toHex: 5a0100000000000005780578cdcdcdcd
[Debug][ ..\..\..\..\Roboshop-Pro\Libs\CLibs\RoNetwork\RobotTcp\BlockTcp.cpp ]$ 0 $ [ 88 ][ BlockTcp::sendData ]: b.toHex: 5a0100000000000005780578cdcdcdcd
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值