Вопрос уже когда-то обсуждался.
Суть в том, что в отличии от Qt3 - в Qt4 екземпляр QString не может хранить в себе кодированную копию строки, например, в ASCII формате. И правильно делает.
Метод
toAscii() возвращает
QByteArray, копию временно создаваемой переменной для с-строки. Естественно, если не сохранить ету копию - она сразу же удалится.
У
QByteArray метод
data() или
constData() - ацессорьІ к области данньІх в самом
QByteArray. Пока живёт его екземпляр, ети возвращённьІе указатели валидньІ и ими можно пользоваться.
При вьІходе из
QString::toAscii() убивается из стека возвращённьІй им
QByteArray, и, соответственно, копия указателя, полученного из
data() - теперь указьІвает на мусор.
ВьІходов два:
1. Более правильньІй - пользоваться Qt копиями с-строк, то-бишь
QByteArray:
QByteArray ascii_string = get_some_string().toAscii();
do_something_with_c_string( ascii_string.data() );
do_anything_else_with_c_string( ascii_string.data() );
Конвертация в ASCII здесь произошла один раз.
2. Подставлять в метод с-строку, полученную непосредственно из методов конвертации:
QString tmp = get_some_string();
do_something_with_c_string( tmp.toAscii().data() );
В етом случае указатель, переданньІй в метод
do_something_with_c_string будет оставаться валидньІм до его завершения, так как временньІй екземпляр
QByteArray остаётся жить в стеке и будет уничтожен сразу же при віходе из метода
do_something_with_c_string.
Для наглядности ещё пример:
QString tmp = get_some_string();
char * c_string;
do_something_with_c_string( c_string = tmp.toAscii().data() );
// c_string is not valid now
do_anything_else_with_c_string( c_string );
ВьІзов первого метода проходит нормально.
ВьІзов второго - краш, так как в
c_string теперь мусор.
P.S. Не пользуйтесь лишний раз
QByteArray::data(), если вам действительно не нужно менять данньІе. Пользуйтесь
QByteArray::constData(). Иначе скрьІтьІе общие данньІе будут разделеньІ и вьІ ни за что получите удар по процессору и памяти.