Когда в QT не допускается многократное преобразование в одну строку, например, QString в char * - PullRequest
0 голосов
/ 25 апреля 2018

Так что недавно я конвертировал (пытался) из 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 Ответ

0 голосов
/ 25 апреля 2018

В C ++ вы, программист, несете ответственность за управление временем жизни объектов и данных.

Иногда это скрыто для вас, когда другие объекты управляют временем жизни.

В этом случае это не так.

const char *c_str2 = str2.toLocal8Bit().data(); 

тыс. QString не хранит в себе Local8Bit версию.Когда вы вызываете toLocal8Bit, он создает новый объект в автоматическом / временном хранилище с другой кодировкой.

Когда этот объект Local8Bit уничтожается, он забирает свои данные с собой.

Вкл.В этом случае вы создали временный объект.Его время жизни заканчивается в конце полного выражения, в котором вы его создали.

Член .data() возвращает указатель на объект, для которого вы вызываете его.Этот указатель представляет несобственное представление данных.Когда объект, на который у вас есть указатель, заканчивает свое время жизни, этот указатель больше не действителен.

Таким образом, c_str2 является действительным указателем до тех пор, пока ; в этот момент указатель не повиснет.

Всякий раз, когда вы работаете с неумными указателями в C ++, вы должны понимать время жизни указанных данных.Если вы этого не сделаете, ваш код будет работать в лучшем случае случайно.

...