2013-02-22 2 views
0

안녕하세요 std :: vector <>의 생성자가 out_of_range 예외를 throw하는 이상한 문제가 있습니다. 예외는 다음과 같습니다 :C++ 벡터 생성자가 std :: out_of_range 예외 (Microsoft C++ stdlib)를 throw합니다.

First-chance exception at 0x000007fefde09e5d in 3dsmax.exe: Microsoft C++ exception: std::out_of_range at memory location 0x6726ee40.. 

어쨌든별로 도움이되지 않습니다. 디버거에서 코드는 다음과 같이 표시됩니다.

std::vector<Point3> points; 
std::vector<Point3> normals; 

예외는 두 번째 줄에서 발생합니다. 이것들은 두 개의 지역 변수로 멤버 함수 본문에 있고 여러 번 호출되었음을 의미합니다. 이 두 생성자가 처음 호출되었을 때 예외가 발생하지 않지만 두 번째 줄 (법선)이 두 번째로 누적 된 경우 항상 throw됩니다. 당신은 3ds 맥스의 SDK의 Point3.h에서이 클래스를 찾을 수 있습니다

class GEOMEXPORT Point3: public MaxHeapOperators { 

public: 
float x,y,z; 

// Constructors 
/*! \remarks Constructor. No initialization is performed. */ 
Point3() { /* NO INIT */ } 
/*! \remarks Constructor. x, y, and z are initialized to the values specified. */ 
Point3(float X, float Y, float Z) { 
    x = X; y = Y; z = Z; 
} 
/*! \remarks Constructor. x, y, and z are initialized to the specified values (cast as floats). */ 
Point3(double X, double Y, double Z) { 
    x = (float)X; y = (float)Y; z = (float)Z; 
} 
/*! \remarks Constructor. x, y, and z are initialized to the specified values (cast as floats). */ 
Point3(int X, int Y, int Z) { 
    x = (float)X; y = (float)Y; z = (float)Z; 
} 
/*! \remarks Constructor. x, y, and z are initialized to the specified Point3. */ 
Point3(const Point3& a) { 
    x = a.x; y = a.y; z = a.z; 
} 

:은 "POINT3"클래스처럼 보인다 3DSMAX SDK에 정의되어 있습니다. 그 안에 3 개의 부동 소수점 만 있고 다양한 유형의 생성자가있는 것 같습니다. 나는이 수업에서 문제가 있다는 것을 믿을 수 없다.

Windows 7이 설치된 VisualStudio 2008을 사용하고 있습니다.이 문제를 해결하는 방법에 대한 아이디어가 있습니까? 감사.

업데이트 : 예, 첫 번째 예외입니다.하지만 STL에서 처리되지 않고 직접 응용 프로그램이 다운 될 수 있습니다. (그리고 try-catch를 사용하여 해당 범위를 왜곡하면이 예외를 catch 할 수 있습니다.)

업데이트 : 두 개의 로컬 변수를 스택에서 힙 (새 값 사용)으로 이동하려고 시도했지만 문제가 지속됩니다.

+1

첫 번째 예외 일 뿐이므로 무시하십시오. –

+0

이 예외는 STL에서 발견되지 않고 팝업되어 응용 프로그램이 다운되었습니다. – Lycoress

+0

디버거에서 실행하면 throws가 중단되어 슬프지만 너무 많은 현지화 된 요청을 처리 할 수 ​​없습니다. –

답변

0

디버거 및 Application Verifier와 같은 다양한 보조 도구를 사용하여 break on throws 옵션을 사용하여 일부 컴파일러 최적화가 Visual Studio 디버거를 스크롤한다는 것을 알게되었습니다. 두 변수 선언 사이에서 동일한 범위 아래로 함수 호출이 실행됩니다. 따라서 Visual Studio 디버거에서 강조 표시된 행이 std :: vector "Point3"법선 인 반면, 그리고 F10 키를 눌렀을 때 예외가 발생했습니다. F10 단계에서 실행 된 실제 코드는 강조 표시되지 않았습니다.

디버그 기호가없는 외부 DLL로 리디렉션 된 함수 호출은 무엇보다 나쁘고 그 DLL에서 예외가 발생했습니다. 따라서 디버거에서 catch 된 호출 스택도 손상되었습니다.

인텔 C++ 컴파일러를 사용하고 디버그 버전을 사용하는 경우 모든 최적화 옵션이 해제되어 있습니다. 그러나 해당 범위 내의 코드 실행 순서는 여전히 Visual Studio의 생각을 확실히 확인하지 못합니다. 여기에있는 방법은 예외를 던질 수 있고 주석을 하나씩 주석 처리 할 수있는 모든 것을 주석으로 처리하는 것입니다.