MySQL ++ - Ошибка проверки времени выполнения # 2 - Стек вокруг переменной поврежден - PullRequest
0 голосов
/ 18 сентября 2011

У меня проблемы с MySQL ++, и они отчаянно нуждаются в помощи.Я использую Visual Studio 2010, MySQL ++ v3.1.0 и MySQL v5.1.59 (x86 и x64);Все библиотеки были скомпилированы правильно.Эта ошибка возникает только в версии отладки из-за того, что параметр компилятора «Оба (/ RTC1, эквивалент. / RTCsu) (/ RTC1)» включен.

Редактировать: я должен отметить, что это происходит только в версии отладки,В Релизе это работает как талисман. Я отследил проблему до mysqlpp_d.dll, MySQL ++ объект падает там деструкторы из-за подсчета ссылок.Он жалуется на неспособность получить доступ к памяти счетчика ссылок, и когда он пытается уменьшить его, он падает.По крайней мере, так я думаю.

Я попытался это сделать, чтобы убедиться, что все разыменовано и удалено в правильном порядке (даже если это не имеет значения, но, надеюсь, помогло мне отследить истинную проблему): http://pastebin.com/Ru0uYcy9

Сбой:

Исключение первого шанса на 0x000007feeef5dd4c (mysqlpp_d.dll) в Launcher.exe: 0xC0000005: Место записи нарушения прав доступа 0x000007feeeff5148.Необработанное исключение в 0x000007feeef5dd4c (mysqlpp_d.dll) в Launcher.exe: 0xC0000005: Место записи о нарушении доступа 0x000007feeeff5148.

И разрывы здесь: http://pastebin.com/9Mfr7NwB

1 Ответ

0 голосов
/ 20 сентября 2011

В этом коде есть серьезная ошибка:

mysqlpp::UseQueryResult res;
{
    mysqlpp::Query query = conn.query();
    query << "SELECT USER();";
    res = query.use();
    row = res.fetch_row();
}

Вы не используете все наборы результатов. В MySQL хранимые процедуры, которые возвращают данные, возвращают как минимум два отдельных набора результатов: первый - это запрашиваемые вами результаты, а второй - информация о состоянии самого вызова. См. examples/multiquery.cpp в исходном дистрибутиве MySQL ++ для правильного решения этой проблемы. Также см. раздел 3.16 в руководстве пользователя MySQL ++.

Основным следствием этого является то, что последующие запросы по тому же соединению не будут выполнены.

Я думаю, что повреждение вашей памяти на самом деле является вторичным эффектом, и что основная проблема заключается в игнорировании попыток MySQL C API, чтобы сказать вам, что вы пытаетесь выполнить два перекрывающихся запроса в одном соединении, потому что вы этого не сделали потреблять весь первый набор результатов. Из того небольшого кода, который вы выложили, я вижу, что вы игнорируете возвращенные коды ошибок, поэтому, если вы также отключили исключения MySQL ++, ваш код будет полностью игнорировать эту ошибку и беспечно продолжать топтать все, что не должно ' т.

Кстати, пожалуйста, потеряйте точку с запятой в запросе. Это не требуется с C API, и может вызвать путаницу, особенно перед лицом нескольких запросов. Используйте точку с запятой только для разделения нескольких операторов в одном запросе.

...