Поскольку в вашем коде есть неопределенное поведение:
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()
действителен достаточно долго, чтобы функция могла читать данные.