c++ - 初始化类对象中的 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;}
解决方案
问题在于您的默认值。如果省略成员初始化程序,则默认构造它。对于 的情况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]
在构造函数的主体中执行。
推荐阅读
- javascript - 如何测试(使用 Jest)返回包含另一个承诺的承诺的函数
- javascript - 轻松更改所选文本颜色?
- decision-tree - LightGBM 获取模型决策(规则)-> 模型解释
- ruby-on-rails - ActiveAdmin 无效表单仍然提交
- typescript - 基于数组第一个位置的数组参数类型
- javascript - 在 Javascript 中禁用提交按钮表单
- javascript - 在 D3 中更新力导向图的中心
- asp.net-mvc - 将 Blazor 中的井字游戏转换为 .Net Core MVC
- linux - 是否可以转储 Kbuild?
- javascript - 如何在javascript中更改backgorundColor元素onclick?