考虑一下代码(它没有任何意义):
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)
// ...
}
是否在1)的for循环中在2)的堆上仍在堆中创建了数组,即在2)处是否仍在(不必要地)占用了一些内存?
(我知道该示例可能更简单,但确实很短。)
最佳答案
该数组仍在堆中,但指向该数组的指针丢失。结果是内存泄漏。
因此,应该拆分函数调用,引入一个变量,该变量将存储从create函数返回的指针,然后可以使用该变量释放分配的数组。
也就是说,当调用运算符delete []时,具有动态存储持续时间的数组将被破坏。否则,当程序完成执行时,内存将被释放。
关于c++ - 使用新运算符时的数组生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61020208/