2011-09-17 99 views
0

即时通讯MySQL ++的问题,并迫切需要帮助。我使用的是Visual Studio 2010,MySQL ++ v3.1.0和MySQL v5.1.59(x86 & x64);我正在使用Visual Studio 2010,MySQL ++ v3.1.0和MySQL v5.1.59(x86 & x64); 所有库的编译都已正确。由于编译器设置“Both(/ RTC1,equiv。to/RTCsu)(/ RTC1)”处于打开状态,此错误仅发生在Debug版本中。MySQL ++ - 运行时检查失败#2 - 堆栈周围的变量已损坏

编辑:我应该注意到,这只发生在调试版本。在发布它的作品像一个魅力 我已经追溯到mysqlpp_d.dll的问题,由于引用计数,MySQL ++对象崩溃在那里析构。它抱怨没有能力访问ref counter的内存,当它试图减少它时,它崩溃。至少这就是我认为会发生的事情。

我尝试这样做,以确保一切得到derefrenced并以正确的顺序删除(甚至尽管它无关紧要,但帮我追查真正的问题,我希望):http://pastebin.com/Ru0uYcy9

它崩溃,:

Launcher.exe中0x000007feeef5dd4c(mysqlpp_d.dll)的第一次机会异常:0xC0000005:访问冲突写入位置0x000007feeeff5148。 Launcher.exe中的0x000007feeef5dd4c(mysqlpp_d.dll)未处理的异常:0xC0000005:访问冲突写入位置0x000007feeeff5148。

而且breakes这里: http://pastebin.com/9Mfr7NwB

+0

您是否将库的调试版本与应用程序的调试版本链接起来? – alexisdm

+0

是的,我确定everthing在所有版本中都正确链接。 – CFortner

+0

好的,我已经做了一些更多的调试并创建了一个全新的控制台项目。我没有收到任何错误。 两者之间的唯一区别是一个是DLL项目,另一个是Console项目,但我怀疑这是考虑代码工作的问题,只是内存处理没有。 这使我得出结论,引擎即时通讯工具,会进行某种内存管理,影响MySQL ++如何处理其内存。 – CFortner

回答

0

此代码有一个严重的错误:

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

您还没有消耗所有的结果集。在MySQL中,返回数据的存储过程至少返回两个单独的结果集:第一个是您要求的结果,第二个是有关该调用本身的状态信息。请参阅MySQL ++源代码分发中的examples/multiquery.cpp,以获取正确的处理方法。另请参阅MySQL ++用户手册中的section 3.16

这样做的主要后果是稍后对相同连接的查询将失败。

我认为你的内存损坏实际上是一种次要的影响,主要的问题源于忽略了MySQL C API试图告诉你,你试图在同一个连接上运行两个重叠的查询,因为你没有' t消耗整个第一个结果集。从你发布的很少的代码中,我可以看到你忽略了返回的错误代码,所以如果你还禁用了MySQL ++异常,你的代码将完全忽略这个错误并且轻快地继续践踏它不应该的东西,吨。

顺便说一下,请在查询中丢失尾随分号。 C API不需要它,并可能导致混淆,特别是在多查询的情况下。使用分号只能在单个查询中分隔多个语句。

相关问题