Как использовать QString toUtf8 и fromUtf8? - PullRequest
2 голосов
/ 26 мая 2019

У меня странная проблема:

    QString s1="abc";
    const char * ss1=s1.toUtf8().constData();
    QString s2=QString::fromUtf8(ss1);
    if(s1==s2)
      qDebug()<<"s1==s2";
    else
      qDebug()<<"s1!=s2";

Вывод вышеуказанного кода: "s1! = S2". На самом деле, содержание ss1 и s2 - беспорядок. Но вывод следующего кода: «s1 == s2». Почему?

    QString s1="abc";
    QString s2=QString::fromUtf8(s1.toUtf8().constData());
    if(s1==s2)
      qDebug()<<"s1==s2";
    else
      qDebug()<<"s1!=s2";

1 Ответ

3 голосов
/ 26 мая 2019

Поскольку в вашем коде есть неопределенное поведение:

const char * ss1 = s1.toUtf8().constData();

QByteArray, возвращаемый функцией toUtf8(), является временным объектом и уничтожается.Но вы сохраняете указатель на его данные, которые затем пытаетесь использовать:

QString s2=QString::fromUtf8(ss1);

Это приводит к неопределенному поведению.

Чтобы это работало, вам нужно сохранить временный объект QByteArrayв живых.Вы можете использовать константную ссылку для этого.Это продлит срок службы временного объекта:

QString s1 = "abc";
const auto& bytes = s1.toUtf8();
const char * ss1 = bytes.constData();

Ваш второй пример подойдет, потому что вы не используете указатели на внутреннюю память уничтоженных объектов:

QString s2 = QString::fromUtf8(s1.toUtf8().constData());

ВременныйОбъект QByteArray, возвращаемый toUtf8(), уничтожается только после возврата вызова fromUtf8().Таким образом, указатель constData() действителен достаточно долго, чтобы функция могла читать данные.

...