我在本周的课程中一直在制作一个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;
}
..而且异常仍然正常。
答案 0 :(得分:0)
解决了这个问题,我所要做的只是改变了在类声明和构造函数中分配内存的方式。