Я столкнулся с проблемой, которую не могу объяснить при преобразовании QByteArray
в const char*
не встроенный. Вот пример:
QString string1("ABCDEFGHI");
const char* stringData1 = string1.toUtf8().constData();
qDebug() << "String:" << string1 << "\nbytearray:" << string1.toUtf8()
<< "\ndata immediate:" << string1.toUtf8().constData() << "\ndata stored:" << stringData1;
QString string2("ABCDEFGHJ");
const char* stringData2 = string2.toUtf8().constData();
qDebug() << "String:" << string2 << "\nbytearray:" << string2.toUtf8()
<< "\ndata immediate:" << string2.toUtf8().constData() << "\ndata stored:" << stringData2;
Я получаю следующий вывод:
String: "ABCDEFGHI"
bytearray: "ABCDEFGHI"
data immediate: ABCDEFGHI
data stored:
String: "ABCDEFGHJ"
bytearray: "ABCDEFGHJ"
data immediate: ABCDEFGHJ
data stored: ABCDEFGHJ
Не гарантируется, что вывод data stored
будет неправильным в случае 1, но правильным в случае 2. Я могу поменять местами случаи 1 и 2, и результат будет таким же - неверный в случае 1, но правильный в случае 2.
Встроенное преобразование работает нормально.
Видите ли вы какие-либо проблемы с преобразованием из QByteArray
в const char*
, если для хранения результата используется переменная const char*
?
toUtf8
возвращает объект, время жизни которого заканчивается в конце выражения.constData
возвращает указатель на этот временный объект.
Таким образом, вы используете висячие указатели, и поведение не определено.
Вам нужно продлить время жизни преобразованной строки:
QString string1("ABCDEFGHI");
QByteArray utfString = string1.toUtf8();
const char* stringData1 = utfString.constData();
Этот вызов string1.toUtf8().constData()
состоит из двух последовательных вызовов: QString::toUtf8()
, который создает временный QByteArray
, и QByteArray::constData()
, который возвращает указатель на временный объект, который в конечном итоге уничтожается.
Способ, которым я использовал, чтобы получить переменную QString, преобразовать ее в QByteArray и, наконец, const char*, таков:
QString var1 = ui->lineEdit->text().toUtf8();
QByteArray ba = var1.toLocal8Bit();
const char *var1final = ba.data();
Значение QString собирается Ui в lineEdit.
Вы звоните
QByteArray::constData
по временномуQByteArray
, возвращенномуQString::toUtf8
. Итак,stringData1
иstringData2
— это висячие указатели: неопределенное поведение.