Различные результаты для QString для const char *

У меня есть фрагмент кода для проверки ошибки кода.

    #include <QCoreApplication>
#include <QDebug>

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString name = QString("Lucy");
QString interest = QString("Swimming");

const char* strInterest = interest.toLatin1().data();
const char* strName = name.toLatin1().data();

qDebug()<<"QName: "<<name<<" QInterest: "<<interest;
qDebug()<<"Name: "<<strName<<" Interest: "<<strInterest;

return a.exec();
}

Результат на Macos:

QName: "Lucy" QInterest: "Swimming"Name: Lucy Interest:
,

Результат на убунту:

root@:test$ ./testCharP
QName: "Lucy" QInterest: "Swimming"Name: Interest:
,
Как видите, преобразованный буфер не сохраняется как постоянное значение, как насчет проблемы?
Кроме того, между этими двумя ОС есть некоторые различия, в чем причина?

1

Решение

То, что вы наблюдаете, — это неопределенное поведение.

Призыв к toLatin1() создает временный QByteArray, который уничтожается сразу после этой строки, так как вы его не храните. Указатель, полученный data() остается висящим и может или не может напечатать что-то полезное.

Правильная версия:

const QByteArray& latinName = name.toLatin1();
const char* strName = latinName.data();
3

Другие решения

Проблема в том, что toLatin1 функция возвращает QByteArray объект, и, не сохраняя этот объект, он будет временным и будет уничтожен после выполнения назначения.

Это означает, что ваш указатель указывает на некоторые данные, которые больше не существуют, и разыменование приведет к неопределенное поведение.

1

А ты уже прошел курс программирования? Супер скидка!
Прокачать скилл $$$
×