C ++ std :: bad alloc ошибка при инициализации объектов класса - PullRequest
0 голосов
/ 16 марта 2019

Я пытаюсь построить следующий класс

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);}}
};

Все работает нормально, но когда я пытаюсь инициализировать RowNumber и ColumnNumber внутри области видимости конструктора Matrix (), удалив комментарий вместоиспользуя инициализирующий список, я получаю сообщение об ошибке «завершение вызова после выброса экземпляра 'std :: bad_alloc' what (): 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;}

Ответы [ 2 ]

1 голос
/ 16 марта 2019

Это потому, что double** Coefficients = new double*[RowNumber]; происходит на этапе инициализации, перед выполнением тела конструктора.Если вы переместите RowNumber в тело конструктора, здесь new double*[RowNumber] RowNumber не определен, что приводит к исключению

1 голос
/ 16 марта 2019

Проблема в вашем значении по умолчанию. Если вы опустите инициализатор члена, он будет создан по умолчанию. Для случая 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] в теле конструктора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...