Реализую свой класс для работы с матрицами, но в одном из методов класса при анализе кода Visual Studio сообщает о переполнении буфера.
Код:
typedef unsigned int UINT;
class NumCxx
{
//some implementation
};
UINT NumCxx::ones(UINT columns, UINT rows) // Method ones creates the matrix;
// UINT - unsigned int
{
if (!checkout())
{
this->dim_array_ = new int* [columns_]; // Creates an array
}
this->columns_ = columns;
this->rows_ = rows;
this->length_ = columns_; // length of an array
for (UINT i = 0; i < columns_; ++i)
{
dim_array_[i] = new int[rows_]; // PROBLEM is here
for (UINT j = 0; j < rows_; ++j)
{
dim_array_[i][j] = 1;
}
}
return 0;
}
Visual Studio подсвечивает строку dim_array_[i] = new int[rows_];
и говорит о переполнении буфера.
Метод UINT NumCxx::checkout()
проверяет, создавалась ли матрица и если нет, то строка this->dim_array_ = new int* [columns_];
создает двумерный динамический массив.
Код checkout():
UINT NumCxx::checkout()
{
if (length_) // Если длина была задана (по умолчанию в конструкторе = 0)
{
for (UINT i = 0; i < length_; ++i)
{
delete[] dim_array_[i];
}
return 1;
}
return 0;
}
Как устранить этот неприятный момент, или же просто проигнорировать (не хотелось бы) ?
length_
, когда у вас
есть и количество строк и количество столбцов.checkout
length_ != 0
. Тогда функцией checkout
освобождается память,
количеством length_
(непонятно сколько), и затем в функции ones
присваивается указательям (но теперь указатели другого количества)
значение.Может все таки хотели this->dim_array_ = new int* [rows_] и dim_array_[i] = new int[columns_];
???
P.S. вместо length_
(это поле вам больше мешает мне кажется) просто используйте columns_
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском