考虑代码(没有有意义的目的):
double* create() {
double *array = new double[100]; // 1)
for(unsigned int i=0; i<100; ++i) array[i] = i;
return array;
}
double reduce(double* array) {
double sum = 0.0;
for(unsigned int i=0; i<100; ++i) sum += array[i];
return sum;
}
int main()
{
double sum = 0.0;
for(unsigned int i=0; i<100; ++i) {
sum += reduce(create());
}
// 2)
// ...
}
在for循环期间在1)中创建的数组是否仍在第2点的堆上),即,在(第2点)是否仍在(不必要地)占用了一些内存)?
((我知道该示例可能更简单,但是确实很短。)
该数组仍在堆中,但指向该数组的指针丢失。结果是内存泄漏。
因此,您应该拆分函数调用,引入一个变量,该变量将存储从函数create返回的指针,然后您可以使用该变量释放分配的数组。
即,当调用运算符delete []时,具有动态存储持续时间的数组将被破坏。否则,当程序完成执行时,内存将被释放。