C ++向量构造函数抛出std :: out_of_range异常(Microsoft C ++ stdlib)

时间:2013-02-22 18:30:18

标签: c++ stl outofrangeexception

嗨我有一个奇怪的问题,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; 
 } 

您可以在3ds max sdk中的Point3.h中找到此类。它里面只有3个浮点数,似乎有足够的各种类型的构造函数。我不敢相信这堂课有问题。

我在Windows 7中使用VisualStudio 2008。如何解决此问题?感谢。

更新:是的,这是第一次机会的例外,但是它没有在STL处理,而是直接启动以使我的应用程序崩溃。 (如果我用try-catch扭曲该范围,我可以在我自己的代码中捕获此异常)

更新:尝试将两个局部变量从堆栈移动到堆(使用new)并且问题仍然存在。

1 个答案:

答案 0 :(得分:0)

通过使用break on throws选项和调试器以及各种其他辅助工具(如Application Verifier),我终于发现某些编译器优化向上滚动了visual studio调试器。在两个变量声明之间执行一个在相同范围内的函数调用。因此,在visual studio调试器中,突出显示的行是 std :: vector“Point3”normals; 并且我按下F10并抛出异常,在F10步骤执行的实际代码是没有那条线突出显示。

更糟糕的是重定向到外部DLL的函数调用,我没有调试符号,异常来自该DLL。因此调试器中捕获的调用堆栈也已损坏。

我使用的是英特尔C ++编译器,并且在调试版本中,所有优化选项都已关闭。但是该范围内的代码执行序列仍然不能完全确认Visual Studio的想法。这里的方法只是注释掉所有可能引发异常的内容并逐一取消注释。