浅拷贝不拷贝对象指向的内存
深拷贝拷贝对象指向的内存
写个报文格式, 转成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