在函数内部的堆上创建数组时,是否有必要在主函数中删除该数组?考虑一下,这个程序:
#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];
是否需要在主程序中删除?我发现每次执行此操作都很难维护和正确。
答案 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
清除。否则,一旦方法返回,内存将不会被释放,从而导致内存泄漏。