在函数内部的堆上创建数组时,是否有必要在主函数中删除该数组?考虑一下,这个程序:
#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;
}
Run Code Online (Sandbox Code Playgroud)
这行:int* my_array = new int[10];是否需要在主程序中删除?我发现每次执行此操作都很难维护和正确。
是的,在您编写的代码中,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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
124 次 |
| 最近记录: |