首页 > 解决方案 > 初始化类对象中的 C++ std::bad alloc 错误

问题描述

我正在尝试构建以下课程

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'什么():std::bad_alloc”。为什么?

PS 问题不在函数 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;}

标签: c++c++17

解决方案


问题在于您的默认值。如果省略成员初始化程序,则默认构造它。对于 的情况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]在构造函数的主体中执行。


推荐阅读