Название: QString::toAscii() Отправлено: xk от Октябрь 08, 2006, 08:08 Возможно вопрос даже не по Qt, а по С++ в целом.
Код:
Вот такой код работает нормально: Код:
А вот при таком коде target указыввает на какой-то мусор: Код:
serv передается в ф-ию по константной ссылке. Объясните плиз в 2-х словах почему так :?: Название: QString::toAscii() Отправлено: Dendy от Октябрь 08, 2006, 09:46 Вопрос уже когда-то обсуждался.
Суть в том, что в отличии от Qt3 - в Qt4 екземпляр QString не может хранить в себе кодированную копию строки, например, в ASCII формате. И правильно делает. Метод toAscii() возвращает QByteArray, копию временно создаваемой переменной для с-строки. Естественно, если не сохранить ету копию - она сразу же удалится. У QByteArray метод data() или constData() - ацессорьІ к области данньІх в самом QByteArray. Пока живёт его екземпляр, ети возвращённьІе указатели валидньІ и ими можно пользоваться. При вьІходе из QString::toAscii() убивается из стека возвращённьІй им QByteArray, и, соответственно, копия указателя, полученного из data() - теперь указьІвает на мусор. ВьІходов два: 1. Более правильньІй - пользоваться Qt копиями с-строк, то-бишь QByteArray: Код: QByteArray ascii_string = get_some_string().toAscii(); Конвертация в ASCII здесь произошла один раз. 2. Подставлять в метод с-строку, полученную непосредственно из методов конвертации: Код: QString tmp = get_some_string(); В етом случае указатель, переданньІй в метод do_something_with_c_string будет оставаться валидньІм до его завершения, так как временньІй екземпляр QByteArray остаётся жить в стеке и будет уничтожен сразу же при віходе из метода do_something_with_c_string. Для наглядности ещё пример: Код: QString tmp = get_some_string(); ВьІзов первого метода проходит нормально. ВьІзов второго - краш, так как в c_string теперь мусор. P.S. Не пользуйтесь лишний раз QByteArray::data(), если вам действительно не нужно менять данньІе. Пользуйтесь QByteArray::constData(). Иначе скрьІтьІе общие данньІе будут разделеньІ и вьІ ни за что получите удар по процессору и памяти. Название: QString::toAscii() Отправлено: xk от Октябрь 08, 2006, 10:39 Большое спасибо !
|