Проблема с преобразованием QByteArray в char*

#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 .