Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 向向量添加字符串时内存损坏<;字符串>;环_C++_Memory_Stl_Vector - Fatal编程技术网

C++ 向向量添加字符串时内存损坏<;字符串>;环

C++ 向向量添加字符串时内存损坏<;字符串>;环,c++,memory,stl,vector,C++,Memory,Stl,Vector,这是在Visual Studio 2008上的双核32位Vista机器上。 在调试代码中运行良好,但在发布模式下: void getFromDB(vector<string>& dates) { ... sql::Resultset res = stmt->executeQuery("SELECT FROM ..."); while (res->next()) { string date = res->getString

这是在Visual Studio 2008上的双核32位Vista机器上。 在调试代码中运行良好,但在发布模式下:

void getFromDB(vector<string>& dates) {
    ...
    sql::Resultset res = stmt->executeQuery("SELECT FROM ...");
    while (res->next()) {
       string date = res->getString("date");
       dates.push_back(date);
    }   // <<< crashing here (line 56)
    delete res;
}

在编译版本中(由于MySQL C++连接器DLL),某些原因在循环结束时崩溃,堆损坏:

HEAP[sa ms release.exe]:为RtlFreeHeap(024E0000、001C4280)指定的地址无效 Windows已在sa-ms-release.exe中触发断点

一切正常。它似乎与MySQL C++连接器GestString()方法返回的字符串有关。返回的字符串被破坏,我想这会导致问题。
但更有可能的是,其他方面出了问题。我使用的是发行版(opt)MySQL连接器。

imho,问题可能来自VS运行时库。这意味着,用于sql连接器方法的DLL不是用“多线程DLL”编译的代码生成选项。因此,不同版本的字符串通过参数传递,它们是chrash。我认为您应该检查此代码生成标志。

imho,问题可能来自VS运行时库。这意味着,您用于sql连接器方法的DLL不是用“多线程DLL”编译的代码生成选项。因此不同版本的字符串通过参数传递,并且它们是chrash。我认为您应该检查此代码生成标志。

您可以查看此标志

尽管XP上报告了这个问题,但情况是一样的。原因是 “字符串在不同堆上被销毁,而不是在创建它的堆上被销毁。”

在您的例子中,字符串是在连接器DLL堆中分配的,而连接器DLL堆是在应用程序堆中释放的


我想你可以在这条线索上找到一些好的建议。(使用相同的运行时编译DLL和应用程序,或在应用程序和DLL调用之间通过引用传递字符串)

您可以查看此内容

尽管XP上报告了这个问题,但情况是一样的。原因是 “字符串在不同堆上被销毁,而不是在创建它的堆上被销毁。”

在您的例子中,字符串是在连接器DLL堆中分配的,而连接器DLL堆是在应用程序堆中释放的



我想你可以在这条线索上找到一些好的建议。(使用相同的运行时编译DLL和应用程序,或在应用程序和DLL调用之间通过引用传递字符串)

您正在编译哪个STL版本、SDK或VS??在代码中提供行号可能会有所帮助(上面消息中的最后一行指定StyleData::getFromDB中的第56行)。Disassabley可能会帮助更多…sql::Resultset::getString(…);的签名是什么;?请记住,只是因为它碰巧在某个地方崩溃,并不意味着错误就在那里-损坏可能是在完全不同的部分造成的。您确定您链接的是MySQL连接器的VS2008版本,而不是VS2005版本吗?(请参阅)?针对哪个STL版本、SDK或VS进行编译??在代码中提供行号可能会有所帮助(上面消息中的最后一行指定StyleData::getFromDB中的第56行)。Disassabley可能会帮助更多…sql::Resultset::getString(…);的签名是什么;?请记住,只是因为它碰巧在某个地方崩溃,并不意味着错误就在那里-损坏可能是在完全不同的部分造成的。您确定您链接的是MySQL连接器的VS2008版本,而不是VS2005版本吗?(看到了吗?)是的。我也猜这就是原因。也许是/MD还是/MDd?如果我没记错的话。如果在调试模式选项中有这些选项,那么这就是为什么MySQl连接器是用/MD编译的,我的代码是用/MT编译的。现在两者都是/MD。代码现在可以工作了!!!谢谢。我也猜这就是原因。也许是/MD还是/MDd?如果我没记错的话。如果在调试模式选项中有这些选项,那么这就是为什么MySQl连接器是用/MD编译的,我的代码是用/MT编译的。现在两者都是/MD。代码现在可以工作了!!!感谢原因是指定了两个冲突的运行库。我认为这相当复杂。这两个DLL必须有单独的堆吗?在Unix/Linux下也是这样吗?Java是如此的简单。我不认为这在Linux下是一样的……是的:)。。我也觉得java在这些情况下更容易,因为它抽象了所有较低级别的细节。。。但他们这样设计可能有特定的原因!我永远无法理解这些决定背后复杂的推理逻辑!!:)原因是指定了两个冲突的运行库。我认为这相当复杂。这两个DLL必须有单独的堆吗?在Unix/Linux下也是这样吗?Java是如此的简单。我不认为这在Linux下是一样的……是的:)。。我也觉得java在这些情况下更容易,因为它抽象了所有较低级别的细节。。。但他们这样设计可能有特定的原因!我永远无法理解这些决定背后复杂的推理逻辑!!:)
virtual std::string getString(const std::string& columnLabel) const = 0;
    ntdll.dll!_RtlpBreakPointHeap@4()  + 0x28 bytes 
    ntdll.dll!_RtlpValidateHeapEntry@12()  + 0x713e8 bytes  
    ntdll.dll!_RtlDebugFreeHeap@12()  + 0x9a bytes  
    ntdll.dll!@RtlpFreeHeap@16()  + 0x145cf bytes   
    ntdll.dll!_RtlFreeHeap@12()  + 0xed5 bytes  
    kernel32.dll!_HeapFree@12()  + 0x14 bytes   
>   sa-ms-release.exe!free(void * pBlock=0x001c4280)  Line 110  C
    sa-ms-release.exe!std::allocator<char>::deallocate(char * _Ptr=0x001c4280, unsigned int __formal=32)  Line 140 + 0x9 bytes  C++
    sa-ms-release.exe!std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Tidy(bool _Built=true, unsigned int _Newsize=0)  Line 2158 C++
    sa-ms-release.exe!std::basic_string<char,std::char_traits<char>,std::allocator<char> >::~basic_string<char,std::char_traits<char>,std::allocator<char> >()  Line 907    C++
    sa-ms-release.exe!StyleData:: getFromDB( std::vector<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > > & dates)  Line 56 + 0x69 bytes    C++
string date = res->getString("date")
string date = string ("2008-11-23");