【发布时间】:2014-07-01 06:00:47
【问题描述】:
我得到运行时异常;
运行时检查失败 #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 库并试图捕获在 connect 调用时发生的 SQLException。
编辑
将每个 CString 类型转换为 LPCTSTR 后的输出窗口:
MyApp.exe 中 0x75B61D4D 处的第一次机会异常:Microsoft C++ 异常:内存位置 0x0493F8C0 处的 sql::SQLException。
MyApp.exe 中 0x75B61D4D 处的第一次机会异常:Microsoft C++ 异常:内存位置 0x0493F8C0 处的 sql::SQLException。
MyApp.exe 中 0x005E18A5 处未处理的异常:堆栈 cookie 检测代码检测到基于堆栈的缓冲区溢出。
【问题讨论】:
-
来自
m_loginInfo.hostName.IsEmpty()我得出结论m_loginInfo.hostName是CString类型。CStrings 必须在传递给CString::Format之前显式转换为LPCTSTR。不过,我看不出这会如何破坏堆栈。您可以查看get_driver_instance来查找原因。
标签: c++ mysql runtime-error stack-corruption