![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
spumer |
![]() ![]()
Сообщение
#11
|
Студент ![]() Группа: Новичок Сообщений: 18 Регистрация: 28.3.2011 Пользователь №: 2546 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
у меня под линюксом вот такой код Отдельно он и у меня работает. Пробовал баловаться с флагами -MD, -MT. Исключение происходит в конструкторе класса. Создается объект класса, внутри себя он подключается куда я ему сказал. [Перед вызовом методов хочу поместить проверку на наличие ошибок в экземпляре класса, метод getLastError() const возвращает мне номер ошибки] Затем я вызываю его методы и они запрашивают определенную инфу с сервера. Удаляю объект. P.S: В качестве граф. оболочки для приложения использую QT4. Все статически линкуется. |
|
|
spumer |
![]()
Сообщение
#12
|
Студент ![]() Группа: Новичок Сообщений: 18 Регистрация: 28.3.2011 Пользователь №: 2546 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Проделал след. опыт: в конце функции, в которой создается экземпляр моего класса, я добавил:
дабы сгенерировать исключительную ситуации на подобие той, что возникает в конструкторе. Однако это не вызвало вылет программы, ошибка записалась и приложение продолжило работу. Я не могу понять почему все именно так. |
|
|
spumer |
![]() ![]()
Сообщение
#13
|
Студент ![]() Группа: Новичок Сообщений: 18 Регистрация: 28.3.2011 Пользователь №: 2546 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Все решилось довольно просто.
Как я понял, проблема возникала из-за использования моего недопиленного костыля:
Видимо внутри себя он(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); Внес исправления:
А в функции запроса, я сделал соответствующую проверку:
Возник еще вопрос. Если я пытаюсь перед выходом из функции удалить объект ptr - ошибка. Если я пытаюсь использовать boost::scoped_ptr - ошибка. Не получается освободить ресурсы. У меня конечно есть идея: создать boost::shared_ptr объект, поместить его в класс MainWindow, а в этой функции лишь .. ну вы поняли. Вобщем переложить работу с памятью для класса SE_Query на умный указатель и вынести его за пределы функции. Ну а если в целом, то все работает. Осталось лишь утечки памяти отловить. Забыл: перед выходом из функции удалить объект ptr Если пытаюсь удалить в блоке if(ptr->getLastError()), в конце самой функции конечно идет удаление этого объекта. |
|
|
Iron Bug |
![]()
Сообщение
#14
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
по этим отдельным кускам ничего сказать нельзя. ошибки с распределением памяти могут быть очень хитрые и вовсе даже не зависеть от той переменной, которую удаляешь. приводи весь код - тогда будет видно. а так гадать бесполезно.
|
|
|
spumer |
![]()
Сообщение
#15
|
Студент ![]() Группа: Новичок Сообщений: 18 Регистрация: 28.3.2011 Пользователь №: 2546 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Iron Bug |
![]()
Сообщение
#16
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
а на входе что подаёшь?
host может оказаться нулевым. это не учтено, я не знаю, что выдаст lexical_cast на нулевой указатель. но это мелочи. в деструкторе SE_Query делается попытка удалить указатели:
а они запросто могут быть нулевыми, ибо в конструкторе не все пути их инициализируют. |
|
|
spumer |
![]()
Сообщение
#17
|
Студент ![]() Группа: Новичок Сообщений: 18 Регистрация: 28.3.2011 Пользователь №: 2546 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
spumer |
![]()
Сообщение
#18
|
Студент ![]() Группа: Новичок Сообщений: 18 Регистрация: 28.3.2011 Пользователь №: 2546 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Iron Bug |
![]()
Сообщение
#19
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
lexical_cast по-моему, он там вообще не требуется. стандартный конструктор std::string жрёт char* на входе без проблем. если бы дело было в скорости, было бы ещё понятно, но тут она явно не приоритетна, ибо операции разовые. а lexical_cast как раз имеет свойство кидать эксепшны и в норме его всегда нужно оборачивать в try-catch. Реакция венды на delete ptr перед return; . дык, оно вообще не информативно. абсолютно пустое сообщение венды, чисто для юзера. если бы там хоть подробности были раскрыты - тогда ещё бы что-то было ценное. Сообщение отредактировал Iron Bug - 18.7.2011, 22:50 |
|
|
spumer |
![]()
Сообщение
#20
|
Студент ![]() Группа: Новичок Сообщений: 18 Регистрация: 28.3.2011 Пользователь №: 2546 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 19.6.2025, 1:52 |