2009-09-29 1 views
1

이것은 Visual Studio 2008의 듀얼 코어 32 비트 Vista 시스템입니다.벡터에 문자열을 추가 할 때 메모리가 손상됩니다. <string> 루프

virtual std::string getString(const std::string& columnLabel) const = 0; 

컴파일 된 버전에서 어떤 이유 (대한이 잘 실행하지만 릴리스 모드에서 디버그 코드에서 이 폭탄 : 그것은 ResultSet의의에

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++ 커넥터는이 방법이 있습니다

HEAP [SA-MS-release.exe] : RtlFreeHeap (024E0000, 001C4280에 지정된 잘못된 주소) 01,235,164 MySQL의 C++ 커넥터 DLL) 이것은 힙 손상과 루프의 끝에서 충돌Windows에서 sa-ms-release.exe에서 중단 점을 트리거했습니다.

[email protected]() + 0x28 bytes 
    [email protected]() + 0x713e8 bytes 
    [email protected]() + 0x9a bytes 
    [email protected]@16() + 0x145cf bytes 
    [email protected]() + 0xed5 bytes 
    [email protected]() + 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++ 

나는 내가 벡터 내부에 보존 할 문자열에 호출 할 소멸자 원인이 몇 가지 기본적인 C++ 규칙을 위반 할 수있다 생각합니다.

내가

string date = string ("2008-11-23"); 

모든 것을

string date = res->getString("date") 

교체 할 경우 잘 작동합니다. MySQL C++ Connector getString() 메서드에서 반환 된 문자열과 관련이있는 것으로 보입니다. 반환 된 문자열이 파손되어 문제가 발생합니다. 하지만 다른 가능성이 더 높습니다. MySQL Connector를 사용하고 있습니다.

+1

컴파일 대상 STL 버전, SDK 또는 VS? – vpram86

+0

코드에 줄 번호를 넣으면 도움이 될 수 있습니다 (위 메시지의 마지막 줄은 StyleData :: getFromDB의 56 번째 줄을 지정합니다). Disassebly 더 많은 도움이 될 수도 있습니다 ... – Tomek

+0

sql :: Resultset :: getString (...); –

답변

6

imho, VS 런타임 라이브러리에서 문제가 발생할 수 있습니다. 즉, SQL 커넥터 메서드에 사용하는 DLL은 "다중 스레드 dll"코드 생성 옵션으로 컴파일되지 않습니다. 문자열의 다른 버전은 매개 변수를 통해 전달되며 chrash 이 코드 생성 플래그를 확인해야한다고 생각합니다.

+0

예.나도 그 이유가 될 것 같아. 아마/MD 또는/MDd? 내가 정확히 기억한다면. DEBUG 모드 옵션에 이러한 옵션이있는 경우, 그 이유는 분명합니다. – vpram86

+0

MySQl 커넥터는/MD로 컴파일되고/MT로 코드는 컴파일됩니다. 이제 둘 다/MD입니다. 코드가 이제 작동합니다! 고마워요 –

3

당신은 문제가 XP에보고하더라도이 thread

에 모습을 가질 수, 상황은 동일합니다. 그 이유는 "문자열이 생성 된 문자열이 아닌 다른 힙에서 삭제되기 때문입니다."

경우에 따라 응용 프로그램 힙에서 해제 된 커넥터 DLL 힙에서 문자열이 할당됩니다.

그 스레드에 대한 좋은 제안을 찾을 수있을 것 같습니다. (동일한 런타임을 사용하여 DLL과 APP를 컴파일하거나 응용 프로그램과 DLL 호출간에 참조로 문자열 전달)

+0

이유는 두 충돌 런타임 라이브러리가 지정되었습니다. 나는 이것이 꽤 복잡하다고 생각한다. 두 DLL은 별도의 힙을 가져야합니까? 유닉스/리눅스에서 동일합니까? 자바는 훨씬 쉽습니다. –

+0

나는 이것이 리눅스에서 동일하다고 생각하지 않는다. .. 예 :) 나는 자바가이 모든 경우에 더 낮은 레벨의 세부 사항을 추상화함으로써 더 쉽다고 느낀다. 그러나 그들이 왜 그런 식으로 설계했는지에 대한 특별한 이유가있을 수있다! 나는이 결정들 뒤에 그 복잡한 논리적 논리를 결코 이해할 수 없다 !! :) – vpram86

관련 문제