我正在尝试使用 mysql connexion 从我的数据库中获取 std::string
这是简单的代码:
sql::Statement *stmt = con->createStatement();
sql::ResultSet *res = stmt->executeQuery("SELECT * FROM test.new_table");
while (res->next()) {
std::string somestring = res->getString("idnew_table");
} //crashes here
delete res;
delete stmt;
所以,executeQuery 很好,我进入循环,如果我中断,预期的结果在一些字符串中。在 somestring 声明之后,我前进到循环的末尾,它在下一次迭代之前崩溃了!
这是调用堆栈:
> msvcp100d.dll!std::_Lockit::_Lockit(int kind) Line 64 + 0x14 bytes C++
msvcp100d.dll!std::_Container_base12::_Orphan_all() Line 200 C++
CM.dll!std::_String_val<char,std::allocator<char> >::~_String_val<char,std::allocator<char> >() Line 478 + 0xb bytes C++
CM.dll!std::basic_string<char,std::char_traits<char>,std::allocator<char> >::~basic_string<char,std::char_traits<char>,std::allocator<char> >() Line 755 + 0xf bytes C++
CM.dll!DAL::GetInfo() Line 45 + 0xc bytes C++
输出:
First-chance exception at 0x1038ad4a (msvcp100d.dll) in CMLauncher.exe: 0xC0000005: Access violation reading location 0xccccccd0.
Unhandled exception at 0x76f615de in CMLauncher.exe: 0xC0000005: Access violation reading location 0xccccccd0.
First-chance exception at 0x76f5016e in CMLauncher.exe: 0x00000000: The operation completed successfully.
Unhandled exception at 0x76f615de in CMLauncher.exe: 0x00000000: The operation completed successfully.
所以看起来我在 C++ 运行时库的某个地方有一些未初始化的内存......看起来它在 std::string 析构函数中崩溃了,这是有道理的,因为它在字符串的范围完成时崩溃了......
我最好的猜测是 libmysql 使用的是旧版本的 C++ 运行时(比如 msvcp90d.dll)并且它与新版本发生冲突......这是否有意义?
我在windows 7下,使用mySQL Server 5.5,VS2010 Pro。全部为 32 位。谢谢!我很乐意发布任何需要的 mroe 信息。
编辑:在其他人阅读 DumbCoders 评论之前: MySQL 连接器示例 文档指定必须删除语句和结果集。