Все решилось довольно просто.
Как я понял, проблема возникала из-за использования моего недопиленного костыля:
ADDRESS* get_addr(char *address){
ADDRESS *ptr = new ADDRESS;
ptr->host = address;
// Require optimization!
char *p;
if( !(p = strrchr(address, ':')) )
ptr->port = p = 0;
else{
ptr->port = p + 1;
*p = '\0';
}
return ptr;
}
Видимо внутри себя он
(resolver.resolve) что-то делал такое с этими указателями, что вызывало исключительную ситуацию.
Я посмотрел на конструкторы udp::resolver::query, и обнаружил:
Цитата
basic_resolver_query(
const protocol_type & protocol,
const std::string & host,
const std::string & service,
resolver_query_base::flags resolve_flags = address_configured);
Внес исправления:
udp::resolver::query query(udp::v4(),
boost::lexical_cast<std::string>(host),
boost::lexical_cast<std::string>( !port ? "27015" : port ) );
udp::resolver::iterator resolve_iter = resolver.resolve(query, error_code);
if( !(lastError = error_code.value()) ){/*...*/}
А в функции запроса, я сделал соответствующую проверку:
SE_Query *ptr = new SE_Query(addr->host, addr->port, 600);
if(ptr->getLastError()){
ui->label_3->setText(QString::fromLocal8Bit("Сервер не ответил"));
return;
}
Возник еще вопрос. Если я пытаюсь перед выходом из функции удалить объект ptr - ошибка. Если я пытаюсь использовать boost::scoped_ptr - ошибка.
Не получается освободить ресурсы. У меня конечно есть идея: создать boost::shared_ptr объект, поместить его в класс MainWindow, а в этой функции лишь .. ну вы поняли. Вобщем переложить работу с памятью для класса SE_Query на умный указатель и вынести его за пределы функции.
Ну а если в целом, то все работает. Осталось лишь утечки памяти отловить.
Забыл:
Цитата(spumer @ 18.7.2011, 15:13)
перед выходом из функции удалить объект ptr
Если пытаюсь удалить в блоке if(ptr->getLastError()), в конце самой функции конечно идет удаление этого объекта.