"Vector subscript out of range",在返回声明?



我的程序在返回语句上引发"向量下标超出范围">异常(EDIT:断言)。好吧,看起来是这样,因为它正好在那个断点上提出它。

这是导致它的函数:

Matrix4 Perspective(float fov, float aspect, float near, float far) const {
double yScale = 1.0 / tan(TO_RADIANS * fov / 2);
double xScale = yScale / aspect;
double depth = near - far;
Matrix4 perspective;
perspective[0][0] = xScale;
perspective[1][1] = yScale;
perspective[2][2] = (far + near) / depth;
perspective[2][3] = 2 * far * near / depth;
perspective[3][2] = -1;
perspective[3][3] = 0;
return perspective; // Raises exception here?
}

我的默认Matrix4构造函数很好,它基本上是这样做的:

_matrix.resize(4);
for (unsigned int i = 0; i < 4; ++i)
_matrix[i].resize(4);

_matrix是一个std::vector<std::vector<float>>属性。所以一切都设置为 0。

最后,使用 return 语句结果的代码段是这样的:

Matrix4 camera = Perspective(70, 1, 0.2, 10);

我有一个看起来也不错的复制构造函数:

Matrix4(const Matrix4& matrix) {
_matrix.reserve(4);
for (unsigned int i = 0; i < 4; ++i) {
_matrix[i].reserve(4);
for (unsigned int j = 0; j < 4; ++j)
_matrix[i][j] = matrix[i][j];
}
}

(我还有一个重载运算符[],但问题真的不能由它引起。

异常断言似乎在return perspective;上提出,但也许它是由调用该方法的代码行引发的,并且复制构造函数以某种方式未能复制?但在这种情况下,Visual Studio 应该将我带入构造函数,因为我正在使用详细的分步......

我在这一点上迷路了...

在复制构造函数中,更改以下内容:

_matrix.reserve(4);

对此:

_matrix.resize(4);

由于您想实际分配空间vector::resize,以便_matrix[i][j] = matrix[i][j];顺利工作。vector::reserve设置矢量的容量。

阅读更多关于矢量调整大小与反向。

您错误地使用了reserve而不是resize

但是您可以将复制构造函数简化为

Matrix4(const Matrix4& rhs) : _matrix(rhs._matrix) {}

甚至,如果适用:

Matrix4(const Matrix4&) = default;

你有一个常见的错误。std::vector::reserve

[i]改变载体的容量

,而不是大小,因此,您要么必须在保留后使用push_back,要么像在正常构造函数中一样使用 resize。

最新更新