2011-09-17 2 views
0

님이 MySQL ++에 문제가있어 필사적으로 도움이 필요합니다. 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 카운터의 메모리를 액세스 할 수 없다는 것에 대해 불평하고, 그것을 줄이려고 할 때 충돌합니다. 적어도 내가 생각하는 것.

나는이 없는지 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

예, 전 버전에서 모든 항목이 올바르게 연결되었는지 확인했습니다. – CFortner

+0

그래, 좀 더 디버깅을하고 신선한 콘솔 프로젝트를 만들었습니다. 그리고 나는 어떤 오류도받지 않았다. 둘 사이의 유일한 차이점은 하나는 DLL 프로젝트이고 다른 하나는 콘솔 프로젝트입니다. 그러나 이것은 코드 작동을 고려할 때 문제가 아닌지 의심 스럽습니다. 이것은 엔진이 메모리 관리를 어떻게하는지에 대한 결론이 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의 시도를 무시함으로써 당신이 동일한 연결에서 두 개의 겹치는 쿼리를 실행하려고 시도하고 있다는 것을 알 수 있습니다. 전체 첫 번째 결과 집합을 소비합니다. 내가 게시 한 작은 코드에서 반환 된 오류 코드를 무시한다는 것을 알 수 있습니다. 따라서 MySQL ++ 예외도 비활성화 한 경우 코드가이 오류를 완전히 무시하고 blithely 계속해서 모든 작업을 수행 할 수 있습니다. 티.

그런데 검색어에 후행 세미콜론을 잃어 버려주세요. C API에서는 필요하지 않으며, 특히 다중 쿼리가있을 때 혼란을 야기 할 수 있습니다. 세미콜론은 단일 쿼리에서 여러 명령문을 분리 할 때만 사용하십시오.