Я уже как-то писал про "мистику" . Вот сегодня еще наткнулся на интересные грабли. Задача такая есть юникодная строка надо конвертить ее в UTF8, получить указатель на то что получилось и дальше обработать. Если писать так
void foo(const char * data)
{
int len=strlen(data);
//работаем с указателем data
}
wxString str(wxT("sometext"));
foo(str.ToUTF8().data());
Все работает отлично. Если попытатся это реализовать прямо в коде
wxString str(wxT("sometext"));
const char * cp=str.ToUTF8().data();
int len=strlen(cp);
//работаем с указателем data
То начинает бардак. Оно не работает, cp указывает на мусор, но если поставить брейкпоинт на 3 строчку и посмотреть в watch окне значение str.ToUTF8(), то после этого все хорошо, и cp указывает куда надо и длина правильно считается. Мистика:)
Если я правильно понимаю то дело во временности буфера возвращяемого ToUTF8(). В первом случаем он видимо уничтожается после выхода из функции, поэтому в теле функции указательно возвразщаемый data() валиден. Во втором wxCharBuffer уничтожается сразу же (?) и указатель кривой, но дебагер его как-то возвращяет в жизни…. – кто силен в теории с++ подскажите в чем дело грамотно:)
Вообщем что бы обойти это приходится писать вот такой код:
wxString str(wxT("sometext"));
const wxCharBuffer tcb=str.ToUTF8();
const char * cp=tcb.data();
int len=strlen(cp);
//работаем с указателем data
Это работает!