Скопируйте массив символов в массив QByte, не передавая указатель - PullRequest
0 голосов
/ 02 октября 2018

Я хочу скопировать массив символов в QByteArray.

Функция:

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

просто передает указатель:

Из документации:Создает QByteArray, который использует байты первого размера массива данных.Байты не копируются.QByteArray будет содержать указатель данных.

После того, как я удалю tmpData, значения, на которые указывает QByteArray, исчезнут.Как я могу сделать копию с помощью инструментов qt?

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

Из документации конструктора QByteArray::QByteArray(const char*, int) видно, что

QByteArray делает глубокую копию строковых данных.

какв отличие от статического QByteArray::fromRawData, для которого указана следующая семантика:

Создает массив QByteArray, который использует байты первого размера массива данных.Байты не копируются.

Следовательно, вы должны иметь возможность получить глубокую копию данных с помощью

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

и освободить tmpData после построения msg->mBufferдолжно быть хорошо.

0 голосов
/ 03 октября 2018

Вы не должны использовать голый массив для начала.Преобразуйте ваш код в:

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

Вы можете использовать tmpData в большинстве случаев, где ожидается char *.

0 голосов
/ 02 октября 2018

Просто используйте соответствующий конструктор , чтобы сделать глубокую копию данных ...

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

В качестве отступления, вам следует рассмотреть использование контейнера, такого как std::vectorчем явные new / delete вызовы в вашем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...