"矢量下标超出范围",在return语句?

时间:2018-01-24 14:57:02

标签: c++ vector outofrangeexception

我的程序提出了一个"向量下标超出范围"返回语句中的异常编辑:断言)。好吧,它似乎是因为它正好在那个断点上提升它。

以下是导致它的功能:

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);

_matrixstd::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应该将我带入构造函数中,因为我使用了详细的逐步...

我此时已经迷失了......

3 个答案:

答案 0 :(得分:4)

在复制构造函数中,更改:

[TestFixture]
    public class MyFixture
    {
        [IntegrationTest]
        [Test]
        public void MyTest1()
        {
        }

        [UnitTest]
        [Test]
        public void MyTest1()
        {
        }
    }

到此:

_matrix.reserve(4);

因为您希望使用vector::resize实际分配空间,以便_matrix.resize(4); 能够顺利运行。 vector::reserve设置了向量的容量。

vector resize VS reverse中阅读更多内容。

答案 1 :(得分:3)

您错误地使用reserve代替resize

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

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

甚至,如果适用:

Matrix4(const Matrix4&) = default;

答案 2 :(得分:3)

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

  

[i]增加[s]向量的容量

,而不是大小,因此您必须在保留后使用push_back,或使用调整大小,就像在普通构造函数中一样。