返回语句抛出C ++ bad_array_new_length异常?

时间:2017-10-04 02:43:54

标签: c++ exception multidimensional-array return

我在本周的课程中一直在制作一个Matrix课程并且遇到了一个让我感到难过的问题:我的一个函数的return语句抛出了bad_array_new_length异常!

以下是我用来查找此内容的示例代码:

Matrix Matrix::operator*(Matrix& mat)
{
    if (this->columns != mat.rows)
    {
        //Do code if Matrix can't be multiplied.
    }
    else
    {
        Matrix result(this->rows, mat.columns);

        //Multiply Matrices together.

        //Print out result to prove the local Matrix works fine.
        //It does.

        try
        {
            return result;
        }
        catch (const exception& e)
        {
            cout << "return exception: " << e.what() << endl;
            return result;  //To be caught again in the test.
        }
    }
}

低,看,当我运行该功能时,它打印出来&#34;返回异常:bad_array_new_length&#34;到控制台上。

该功能的测试如下:

try
{
    answer = A1 * B1;   //A1 and B1 are able to be multiplied.
}
catch (const exception& e)
{
    cout << e.what() << endl;
}

测试还会捕获异常并将其打印出来。

在做了一些研究之后,只有当数组被赋予无效长度时才会抛出bad_array_new_length异常。 Matrix类确实使用多维数组来存储其双精度数,但我认为这不是问题的根源,因为本地矩阵可以完全按预期工作。

以下是如何在构造函数中声明和初始化多维数组,以防万一:

//Matrix.h

unsigned int rows;
unsigned int columns;

double ** storage = new double*[rows];  //Multidimensional array isn't completely formed, see the constructor.

///////////////////////////////////////////////////////////////////////////////////////////////////////////////

//Matrix.cpp

Matrix::Matrix(unsigned int x, unsigned int y)
:
    rows(x),
    columns(y)
{
    for (unsigned int i = 0; i < rows; ++i) //Completes the formation of the multidimensional array.
        storage[i] = new double[columns];

    for (unsigned int i = 0; i < rows; ++i)
    {
        for (unsigned int q = 0; q < columns; ++q)
        {
            storage[i][q] = 0;  //Initializes each value in the array as 0.
        }
    }
}

/////////////////////////////////////////////// ////////////////////////////////////////////////// ////

编辑:

这是定义的复制构造函数和赋值运算符:

Matrix::Matrix(const Matrix& obj)
{
    rows = obj.rows;
    columns = obj.columns;

    for (unsigned int i = 0; i < rows; ++i)
    {
        for (unsigned int q = 0; q < columns; ++q)
        {
            storage[i][q] = obj.storage[i][q];
        }
    }
}

////////////////////////////////////////////////////////////////////////////////

bool Matrix::operator=(Matrix mat)
{
    rows = mat.rows;
    columns = mat.columns;

    for (unsigned int i = 0; i < rows; ++i)
    {
        for (unsigned int q = 0; q < columns; ++q)
        {
            storage[i][q] = mat.storage[i][q];
        }
    }

    return true;
}

出于好奇,我将测试中的代码更改为:

try
{
    A1 * B1;    //Removed assignment to answer Matrix.
}
catch (const exception& e)
{
    cout << e.what() << endl;
}

..而且异常仍然正常。

1 个答案:

答案 0 :(得分:0)

解决了这个问题,我所要做的只是改变了在类声明和构造函数中分配内存的方式。