C6386: Переполнение буфера при записи

216
26 декабря 2021, 07:30

Реализую свой класс для работы с матрицами, но в одном из методов класса при анализе кода 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;
  }

Как устранить этот неприятный момент, или же просто проигнорировать (не хотелось бы) ?

Answer 1
  1. Абсолютно не понятно зачем нужен вам член length_ , когда у вас есть и количество строк и количество столбцов.
  2. Не обращаем на это внимание и допускаем, что до вызова checkout length_ != 0. Тогда функцией checkout освобождается память, количеством length_(непонятно сколько), и затем в функции ones присваивается указательям (но теперь указатели другого количества) значение.

Может все таки хотели this->dim_array_ = new int* [rows_] и dim_array_[i] = new int[columns_];???

P.S. вместо length_(это поле вам больше мешает мне кажется) просто используйте columns_

READ ALSO
Задача по функциям C++ [закрыт]

Задача по функциям C++ [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

226
C++, приоритет операторов

C++, приоритет операторов

Рассмотрим следующий пример:

81
Как поменять &quot;e+...&quot; на знак степени &quot;10^...&quot;

Как поменять "e+..." на знак степени "10^..."

Например у меня есть число

95
c# конвертация кодировки

c# конвертация кодировки

Требуется программа которая будет текст из 1252 переводить в 1251

143