在 C++ 中的 2D 动态内存分配数组中释放分配的内存

Posted

技术标签:

【中文标题】在 C++ 中的 2D 动态内存分配数组中释放分配的内存【英文标题】:free allocated memory in 2D dynamic memory allocation array in C++ 【发布时间】:2013-01-27 14:02:33 【问题描述】:

我最近发布了一个关于此的问题,但这是一个不同的问题。我使用动态内存分配创建了一个二维数组,使用矩阵后,我们需要通过删除它来释放内存,我不明白为什么我们不能只使用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;

【讨论】:

如果我只写delete[] matrix;会发生什么? @user1986597 您将泄漏为矩阵中所有数组分配的内存。 Tony The Lion 是对的,在严格的场景中这是正确的答案,我应该接受。 thanksss 它工作得很好,所以将删除实际矩阵放在循环内一直是错误的?【参考方案2】:

如果您仍然使用动态数组,我强烈建议您使用 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

使用 new 和 delete 并不是真正的现代风格,这是有充分理由的。根据 C++ 和 Beyond 约定的专家,它应该只在性能优化和编写库代码时使用。许多书籍和老师仍然以这种方式教学,但另一方面,大多数书籍都是垃圾。以下是其中的精华:The Definitive C++ Book Guide and List

【讨论】:

我同意,他们应该用现代风格教学生基础材料,而不是像这样的旧东西!!!【参考方案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。

【讨论】:

以上是关于在 C++ 中的 2D 动态内存分配数组中释放分配的内存的主要内容,如果未能解决你的问题,请参考以下文章

c++中new和delete的用法

小白学习C++ 教程十六C++ 中的动态内存分配

如何在 C++ 中动态分配数组

C++ 对象的动态建立 & 释放

C++ 删除不会释放所有内存 (Windows)

New动态分配 Delete 释放内存