Когда в QT не допускается многократное преобразование в одну строку, например, QString в char*
Так что недавно я конвертировал (пытаясь) из QString в char* используя:
QString str;
const char *ptr = str.toLatin1().constData();
Который не выдавал никакой ошибки, но моя программа не работала, и я потратил много времени, чтобы выяснить, что это за ошибка: согласно https://wiki.qt.io/Technical_FAQ#How_can_I_convert_a_QString_to_char.2A_and_vice_versa.3F
Обратите внимание, что необходимо сохранить байтовый массив перед вызовом data() для него, например, следующим образом.
const char *c_str2 = str2.toLocal8Bit().data();
вызовет сбой приложения, так как QByteArray не был сохранен и, следовательно, больше не существует
Поэтому мой вопрос: как узнать, когда этот тип однострочных преобразований опасен, и лучше их избегать? Вообще, когда результатом является указатель или это просто частный случай? С какими еще подобными примерами вы сталкивались?
Большое спасибо.
1 ответ
В C++ вы, программист, несете ответственность за управление временем жизни объектов и данных.
Иногда это скрыто для вас, где другие объекты управляют жизнью.
В этом случае это не так.
const char *c_str2 = str2.toLocal8Bit().data();
тыс QString
не имеет Local8Bit
версия сама хранится в нем. Когда вы звоните toLocal8Bit
он создает новый объект в автоматическом / временном хранилище с другой кодировкой.
Когда это Local8Bit
объект уничтожен, он забирает свои данные.
На этот случай вы создали временный объект. Его время жизни заканчивается в конце полного выражения, которое вы создали.
.data()
member возвращает указатель на объект, который вы вызываете. Этот указатель представляет несобственное представление данных. Когда объект, на который у вас есть указатель, заканчивает свое время жизни, этот указатель больше не действителен.
Так c_str2
является действительным указателем до ;
в этот момент указатель болтается.
Всякий раз, когда вы работаете с неумными указателями в C++, вы должны понимать время жизни указанных данных. Если вы этого не сделаете, ваш код будет работать в лучшем случае случайно.