Я получаю исключение во время выполнения;
Ошибка проверки времени выполнения № 2 — стек вокруг переменной ex был поврежден.
для следующего куска кода.
DBConnPtr CDBConnector::GetConnectionInstance()
{
if (m_pConn)
return m_pConn;
if (m_loginInfo.hostName.IsEmpty() ||
m_loginInfo.portNumber == 0 ||
m_loginInfo.userName.IsEmpty())
return m_pConn;
CString hostInfo(_T(""));
hostInfo.Format("tcp://%s:%d", m_loginInfo.hostName, m_loginInfo.portNumber);
sql::SQLString host = hostInfo;
sql::SQLString user = m_loginInfo.userName;
sql::SQLString pwd = m_loginInfo.userPwd;
try
{
sql::Driver* pDriver = get_driver_instance();
m_pConn = (DBConnPtr)pDriver->connect(host, user, pwd);
}
catch (sql::SQLException ex)
{
}
//mysql_thread_end();
return m_pConn;
}
Перед переездом sql::SQLString pwd = m_loginInfo.userPwd;
вне блока try, он бросал
Ошибка проверки времени выполнения # 2 — стек вокруг переменной ‘pwd’ был поврежден.
Есть идеи почему?
Я использую библиотеку MySQL и пытаюсь поймать SQLException, что происходит на connect
вызов.
Окно вывода после типирования каждого CString в LPCTSTR:
Исключение первого шанса в 0x75B61D4D в MyApp.exe: исключение Microsoft C ++: sql :: SQLException в ячейке памяти 0x0493F8C0.
Исключение первого шанса в 0x75B61D4D в MyApp.exe: исключение Microsoft C ++: sql :: SQLException в ячейке памяти 0x0493F8C0.
Необработанное исключение в 0x005E18A5 в MyApp.exe: код инструментария cookie стека обнаружил переполнение буфера на основе стека.
Как MSDN указывает: Когда вы передаете символьную строку в качестве необязательного аргумента, вы должны явно привести ее к типу LPCTSTR.
Кроме того, это статья указывает на последствия, если вы этого не сделаете.
Если тип SQLString может быть приведен к LPCTSTR, измените эту строку:
hostInfo.Format("tcp://%s:%d", m_loginInfo.hostName, m_loginInfo.portNumber);
чтобы:
hostInfo.Format(_T("tcp://%s:%d"), LPCTSTR(m_loginInfo.hostName), LPCTSTR(m_loginInfo.portNumber));