Когда в 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++, вы должны понимать время жизни указанных данных. Если вы этого не сделаете, ваш код будет работать в лучшем случае случайно.

Другие вопросы по тегам