从函数返回数组时是否需要删除

时间:2018-06-30 19:59:50

标签: c++ c++17

在函数内部的堆上创建数组时,是否有必要在主函数中删除该数组?考虑一下,这个程序:

#include "stdafx.h"
#include <iostream>

using namespace std;

int * return_array() {
    int* my_array = new int[10];
    my_array[0] = 10;
    return my_array;
}

int main()
{
    int * returned_array = return_array();
    cout << returned_array[0];
    delete[] returned_array;
    return 0;
}

此行:int* my_array = new int[10];是否需要在主程序中删除?我发现每次执行此操作都很难维护和正确。

2 个答案:

答案 0 :(得分:4)

是的,在您编写的代码中,在每次调用delete[]之后都必须调用return_array(),因为它是在堆上分配新的内存,而不会自动回收。与Java和其他高级语言不同,C ++没有垃圾收集器。未能调用delete[]会导致内存泄漏和不断增大的堆大小。

正如@Ron在评论中所指出的,一种可行的选择是使用std::vector<int>(如果数组将永远不需要增长,则另请参见std::array)。向量将在内部使用堆分配时,它还会自动为您管理它们,以便在超出范围时自动回收其内存。

#include <vector>

std::vector<int> return_vector() {
    std::vector<int> my_vector(10);
    my_array[0] = 10;
    return my_array;
}

int main()
{
    std::vector<int> returned_vector = return_vector();
    std::cout << returned_vector[0];
    return 0; // vector internal memory is reclaimed
}

答案 1 :(得分:1)

在免费存储中使用new创建的任何对象都必须由delete清除。否则,一旦方法返回,内存将不会被释放,从而导致内存泄漏。