В C ++ вы, программист, несете ответственность за управление временем жизни объектов и данных.
Иногда это скрыто для вас, когда другие объекты управляют временем жизни.
В этом случае это не так.
const char *c_str2 = str2.toLocal8Bit().data();
тыс. QString
не хранит в себе Local8Bit
версию.Когда вы вызываете toLocal8Bit
, он создает новый объект в автоматическом / временном хранилище с другой кодировкой.
Когда этот объект Local8Bit
уничтожается, он забирает свои данные с собой.
Вкл.В этом случае вы создали временный объект.Его время жизни заканчивается в конце полного выражения, в котором вы его создали.
Член .data()
возвращает указатель на объект, для которого вы вызываете его.Этот указатель представляет несобственное представление данных.Когда объект, на который у вас есть указатель, заканчивает свое время жизни, этот указатель больше не действителен.
Таким образом, c_str2
является действительным указателем до тех пор, пока ;
в этот момент указатель не повиснет.
Всякий раз, когда вы работаете с неумными указателями в C ++, вы должны понимать время жизни указанных данных.Если вы этого не сделаете, ваш код будет работать в лучшем случае случайно.