我正在尝试构建以下类
class Matrix
{unsigned int RowNumber, ColumnNumber;
double** Coefficients = new double*[RowNumber];
public:
Matrix() : RowNumber(1), ColumnNumber(2)
{/* Rownumber=1;
ColumnNumber=2; */
for(int i=0; i<RowNumber;i++)
{Coefficients[i]=FillRow(ColumnNumber);}}
};
一切正常,但是当我尝试通过删除注释而不是使用初始化列表来初始化构造函数Matrix()范围内的RowNumber和ColumnNumber时,出现错误“终止,在抛出实例'后调用std :: bad_alloc' what():std :: bad_alloc”。 为什么?
P.S。问题不在函数FillRow中,因为我已经在代码的其他部分中使用了它,并且效果很好,但是为了完整起见,我在这里报告了它:
double* FillRow(unsigned int ColumnNumber)
{double*RowCoefficients = new double[ColumnNumber-1];
static unsigned int CounterFillRow=1;
double k;
cout << "Insert " << ColumnNumber << " coefficients for the " << CounterFillRow << "th row\n";
for(int i=0; i!=ColumnNumber; i++)
{cin >> k;
RowCoefficients[i]=k;}
CounterFillRow++;
return RowCoefficients;}
答案 0 :(得分:1)
问题出在您的默认值上。如果省略成员初始化程序,则它是默认构造的。对于unsigned int RowNumber
,它将是一个垃圾值。 (实际上,它将是一个任意数字)
您具有double** Coefficients
,new double*[RowNumber];
的默认值。如果不初始化RowNumber
,则当您进行new double*[RowNumber];
并且RowNumber
确实很高时,它将无法分配足够的内存,因此会抛出std::bad_alloc
。
使用成员初始化程序是这样的:
unsigned int RowNumber(1);
unsigned int ColumnNumber(2);
double** Coefficients = new double*[RowNumber]; // new double*[2];
for(int i=0; i<RowNumber;i++)
{Coefficients[i]=FillRow(ColumnNumber);}}
没有,它看起来像这样:
unsigned int RowNumber; // Garbage value
unsigned int ColumnNumber;
double** Coefficients = new double*[RowNumber]; // Reading garbage value
RowNumber = 1;
ColumnNumber = 2;
for(int i=0; i<RowNumber;i++)
{Coefficients[i]=FillRow(ColumnNumber);}}
要解决此问题,请不要为Coefficients
设置默认值或将默认值设置为nullptr
,然后在构造函数的主体中执行new double*[RowNumber]
。
答案 1 :(得分:1)
那是因为double** Coefficients = new double*[RowNumber];
发生在初始化阶段,即构造函数主体执行之前。如果将RowNumber移至构造函数主体,则new double*[RowNumber]
RowNumber是未定义的,这会导致异常