свободная выделенная память в двумерном массиве динамической памяти в Stack Overflow

Я недавно опубликовал вопрос об этом, но это другой вопрос. Я создал двумерные массивы, используя динамическое распределение памяти, после того, как матрица используется, нам нужно освободить память, удалив ее, и я не понимаю, почему мы не можем просто использовать delete [] matrix удалить его вместо метода в кодах ниже

int **matrix;

// dynamically allocate an array
matrix = new int *[row];
for (int count = 0; count < row; count++)
matrix[count] = new int[col];

// free dynamically allocated memory
for( int i = 0 ; i < *row ; i++ )
{
delete [] matrix[i] ;
delete [] matrix ;
}

Потому что проблема в том, что в main() я создал двумерный массив и назначил значения, используя другие int ** функции, я не знаю, как удалить выделенную память, цикл вызовет ошибку во время выполнения

    int main()
{
int **matrixA = 0, **matrixB = 0, **matrixResult = 0; // dynamically allocate an array
int rowA, colA, rowB, colB; // to hold the sizes of the matrices

// get values for input method
int inputMethod = userChoiceOfInput();
if (inputMethod == 1) // select input by keyboard
{
cout << "Matrix A inputting...\n";
matrixA = getMatricesByKeyboard(&rowA, &colA);
cout << "Matrix B inputting...\n";
matrixB = getMatricesByKeyboard(&rowB, &colB);
}
else if (inputMethod == 2) // select input by files
{
matrixA = getMatricesByFileInput("F:\\matrixA.txt", &rowA, &colA);
matrixB = getMatricesByFileInput("F:\\matrixB.txt", &rowB, &colB);
}

//addition(matrixA, &rowA, &colA, matrixB, &rowB, &colB);

cout << matrixA[1][0];

////////////////////////run time error///////////////////////
// free allocated memory of matrix A
for( int i = 0 ; i < rowA ; i++ )
{
delete [] matrixA[i] ;
delete [] matrixA ;
}
// free allocated memory of matrix B
for( int i = 0 ; i < rowB ; i++ )
{
delete [] matrixB[i] ;
delete [] matrixB ;
}
////////////////////////run time error///////////////////////

// free allocated memory of matrix A
delete [] matrixA ; // i dont know what would these delete
delete [] matrixB ;

return 0;
}

1

Решение

Вы должны пройти свою матрицу и удалить каждый массив. В конце этого вы можете удалить саму матрицу

// free dynamically allocated memory
for( int i = 0 ; i < *row ; i++ )
{
delete[] matrix[i]; // delete array within matrix
}
// delete actual matrix
delete[] matrix;
7

Другие решения

Если вы все равно используете динамические массивы, я настоятельно рекомендую использовать std :: vector. Потеря производительности практически равна нулю, и, учитывая, что вы можете использовать более изящные алгоритмы std с векторами, ваш код вполне может оказаться более производительным.

unsigned int cols=40, rows=35;
std::vector<int> temp(cols,0); //this is only created so that we can initialize a
//row at a time, the first parameter is the amount of
//elements to initialize with and the second is the value
//to initialize with
std::vector<std::vector<int>> matrix(rows,temp); //creates a vector with 35 vectors each
//initialized with the values in temp

matrix[2][3] = 4;              //use just like a normal array
matrix.resize(88,temp);         //you can add rows later too
matrix.push_back(temp);         //or like this

//probably the most important, you don't need to delete because you never needed to
//use new in the first place

использование нового и удаления не совсем современный стиль, по уважительной причине. Согласно гуру в соглашениях C ++ и Beyond, его следует использовать только в случае оптимизации производительности и при написании кода библиотеки. Многие книги и учителя до сих пор учат этому, но, с другой стороны, большинство книг — мусор. Вот драгоценные камни среди них: Полное руководство и список книг C ++

3

Поскольку тип int * не имеет дескриптора, по крайней мере, у него нет деструктора, который вам нужен. Вы можете избежать всего, что выделяет / освобождает память, делая что-то вроде этого

std::vector<int*> matrix(rows);
std::vector<int> allData(rows * cols);
for(int i = 0; i < rows; i++)
{
matrix[i] = &allData[i * cols];
}

или используя стандартный контейнер, такой как boost :: numeric :: ublas :: matrix.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector