#c #qt #qt5
#c #qt #qt5
Вопрос:
Я столкнулся с проблемой, которую я не могу объяснить при преобразовании QByteArray
в const char*
not inline. Вот один из примеров:
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*
для хранения результата используется переменная?
Комментарии:
1.Вы вызываете
QByteArray::constData
временныйQByteArray
возвращаемыйQString::toUtf8
. ТакstringData1
иstringData2
висят указатели: неопределенное поведение.
Ответ №1:
toUtf8
возвращает объект, время жизни которого заканчивается в конце выражения.
constData
возвращает указатель на этот временный объект.
Таким образом, вы используете висячие указатели, и поведение не определено.
Вам необходимо продлить время жизни преобразованной строки:
QString string1("ABCDEFGHI");
QByteArray utfString = string1.toUtf8();
const char* stringData1 = utfString.constData();
Ответ №2:
Этот вызов string1.toUtf8().constData()
состоит из двух последовательных вызовов: QString::toUtf8()
который создает временный QByteArray
и QByteArray::constData()
который возвращает указатель на временный объект, который в конечном итоге уничтожается.
Ответ №3:
Способ, которым я получал переменную QString, преобразовывал ее в QByteArray и, наконец, const char *, заключается в следующем:
QString var1 = ui->lineEdit->text().toUtf8();
QByteArray ba = var1.toLocal8Bit();
const char *var1final = ba.data();
Значение QString собирается пользовательским интерфейсом в lineEdit .