stl — векторный конструктор C ++ генерирует исключение std :: out_of_range (Microsoft C ++ stdlib)

Привет у меня есть странная проблема, что 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), и проблема не исчезла.

0

Решение

Используя опцию break on throws с отладчиком и различными другими вспомогательными инструментами, такими как Application Verifier, я наконец-то понял, что некоторая оптимизация компилятора прокручивает отладчик visual studio. Вызов функции, которая находится в той же области, выполняется между двумя объявлениями переменных. Следовательно, в визуальной студии отладчик, в то время как выделенная строка была std :: vector нормали «Point3»; и я нажал F10, и было выдано исключение, фактический код, выполненный на этом шаге F10, не был выделен этой строкой.

Что еще хуже, это вызов функции, перенаправленный на внешнюю DLL, у меня нет отладочных символов, и исключение было из этой DLL. Таким образом, стек вызовов, попавший в отладчик, также был поврежден.

Я использовал компилятор Intel C ++ и в отладочной версии все опции оптимизации отключены. Но последовательность выполнения кода внутри этой области еще не совсем подтверждает то, что думает Visual Studio. Путь здесь — просто закомментировать все вещи, которые могут вызвать исключение, и откомментировать их по одному.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]