Привет у меня есть странная проблема, что std :: vector<Конструктор> вызывает исключение out_of_range. Исключение гласит:
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;
и исключение исходит от второй строки. Это две локальные переменные, это означает, что они находятся в теле функции-члена и были вызваны несколько раз. Исключение не возникает, когда эти два конструктора были вызваны впервые, но всегда выдает, когда вторая строка (нормали) была нажата во второй раз. Класс «Point3» определен в 3dsmax SDK, который выглядит следующим образом:
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.h в 3ds Max SDK. Внутри него только 3 числа с плавающей точкой, и, похоже, у него достаточно конструкторов различного типа. Я не могу поверить, что есть проблемы в этом классе.
Я использую VisualStudio 2008 с Windows 7. Есть идеи, как решить эту проблему? Благодарю.
Обновление: да, это исключение из первого шанса, но оно не обрабатывается в STL и выскочило прямо для сбоя моего приложения. (И я могу поймать это исключение в своем собственном коде, если я деформирую эту область с помощью try-catch)
Обновление: Попытка переместить две локальные переменные из стека в кучу (используя new), и проблема не исчезла.
Используя опцию break on throws с отладчиком и различными другими вспомогательными инструментами, такими как Application Verifier, я наконец-то понял, что некоторая оптимизация компилятора прокручивает отладчик visual studio. Вызов функции, которая находится в той же области, выполняется между двумя объявлениями переменных. Следовательно, в визуальной студии отладчик, в то время как выделенная строка была std :: vector нормали «Point3»; и я нажал F10, и было выдано исключение, фактический код, выполненный на этом шаге F10, не был выделен этой строкой.
Что еще хуже, это вызов функции, перенаправленный на внешнюю DLL, у меня нет отладочных символов, и исключение было из этой DLL. Таким образом, стек вызовов, попавший в отладчик, также был поврежден.
Я использовал компилятор Intel C ++ и в отладочной версии все опции оптимизации отключены. Но последовательность выполнения кода внутри этой области еще не совсем подтверждает то, что думает Visual Studio. Путь здесь — просто закомментировать все вещи, которые могут вызвать исключение, и откомментировать их по одному.
Других решений пока нет …