如何删除函数返回的数组

How to delete an array that a function returns

本文关键字:函数 返回 数组 删除 何删除      更新时间:2023-10-16

我是c++的新手,我有一个小的内存泄漏问题。我的程序结构非常简单,如下所示,尽管我省略了与问题无关的部分。

int** foo(int sizeOfArray){
     int** arrayToReturn = new int*[sizeOfArray];
     for (int i = 0; i < sizeOfArray; i++) {
           arrayToReturn[i] = new int[2];
     }
     return arrayToReturn;
}
int main() {       
    a = someNumber;                // 'a' can be any value ( < 64)
    int** someArray = foo(int a);
    // Do stuff with someArray
}

本质上,它调用了一个返回数组的数组的函数。我的问题是,当我的程序调用这个函数数千次时,它们会导致内存泄漏,因为我使用NEW,我需要使用delete。我只是不确定如何删除数组,因为我需要在主函数中使用它们,所以我不能在函数foo中删除它们,但是我如何删除它们呢?我试着删除someArray,但是从arrayToReturn[i] = new int[2]行使用的内存从未被释放。

希望这是有意义的,我很抱歉,如果这是一个愚蠢的问题,感谢阅读!

要完全删除数组,包括其中的子数组,您可以执行以下操作:

// Assuming we have an array called 'array'
int** array = foo(bar);
// Iterate through all the sub-arrays and delete them
for (int i = 0; i < sizeOfArray; i++) {    
   delete [] array[i];
}
// Delete the primary array
delete [] array;

这段代码有一些风格问题,有些人可能会试图告诉你永远不要使用原始指针,但我只是想以一种直截了当的方式为你回答这个问题。

基本上与创建数组的操作顺序相反。首先创建外部数组,然后遍历并创建子数组,要删除,需要先删除子数组,然后删除最外层的数组。

这不是很好的c++,我不记得上次在数组上使用new和delete是什么时候了,那是很久以前的事了。但是,当你学习的时候,你需要知道它是如何工作的,所以继续努力,祝你好运!

以下是int s数组的相关代码:

int* foo = new int[20];
// free the array
delete [] foo;

对于初学者来说,必须按照相对于其分配的相反顺序删除指针。

你可以用下面的方法写一个函数来完成这个任务

void free( int **array, int sizeOfArray )
{
    for ( int i = 0; i < sizeOfArray; i++ ) 
    {
        delete [] array[i];
    }
    delete [] array;
}

也可以定义为

void free( int ** &array, int sizeOfArray )
{
    for ( int i = 0; i < sizeOfArray; i++ ) 
    {
        delete [] array[i];
    }
    delete [] array;
    array = nullptr;
}

您可以使用标头<vector>

中声明的标准类std::vector来代替自己分配和释放内存。

例如你的数组可以定义为

std::vector<std::vector<int>> array( sizeOfArray, std::vector<int>( 2 ) );

在这种情况下,您不需要为释放内存而烦恼。

这个问题的标准解决方案是首先不要走这条路。

std::vector是一站式商店,为您的所有动态数组的需求和std::array代表静态数组。总之,我们得到了一个不错的二维数组,它恰好在内存中是连续的,并且在它超出作用域的那一刻将被释放。

#include <vector>
#include <array>
std::vector<std::array<int, 2>> foo(int sizeOfArray){
    return std::vector<std::array<int, 2>>(sizeOfArray);
}
int main() {
    int a = 50; // your number here
    std::vector<std::array<int, 2>> someArray = foo(a);
    // Do stuff with someArray

} //someArray goes out of scope and is destoyed, freeing all of the allocated memory

参见'deleteArray'函数。你必须先删除子数组。然后删除顶层数组。学习记忆管理是一项很好的技能。一旦你学习了内存管理(使用"new"answers"delete"),你应该学习STL容器。在实践中,人们会使用STL。

我还添加了一个打印功能,这样你就可以看到它是什么样子了。

#include <iostream>
int** foo(int sizeOfArray){
    int** arrayToReturn = new int*[sizeOfArray];
    for (int i = 0; i < sizeOfArray; i++) { 
        arrayToReturn[i] = new int[2];
        for (int j = 0; j < 2; j++){
            arrayToReturn[i][j] = j;
        } 
    } 
    return arrayToReturn;
}
void printArray(int **array, int sizeOfArray){
    for(int i = 0; i < sizeOfArray; i++){
        for(int j = 0; j < 2; j++){
            std::cout << array[i][j] << " "; 
        } 
        std::cout <<  std::endl;
    } 
}
void deleteArray(int **array, int sizeOfArray){
    // Do the inverse of foo
    // Delete the sub arrays (ones with size 2)
    for(int i = 0; i < sizeOfArray; i++){
        delete [] array[i];
    }
    // Then delete the entire array
    delete [] array;
}       
int main(){
    int a = 34;
    int **someArray = foo(a);
    printArray(someArray, a);
    std::cout << someArray << std::endl;
    // Delete pieces of memory
    deleteArray(someArray, a);
    // Readability as well. Set our local reference to NULL
    // Also, will make sure we can't use someArray elsewhere
    someArray = NULL;

    // This 'printArray' call would cause a segfault 
    // printArray(someArray, a);
    return 0;
}