使用 new 运算符时的数组生命周期
Array lifetime when using new operator
考虑代码(没有任何意义):
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 返回的指针,然后您可以使用该变量来释放分配的数组。
即调用operator delete []时,动态存储期的数组会被销毁。或者当程序执行完毕时,内存将被释放。
考虑代码(没有任何意义):
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 返回的指针,然后您可以使用该变量来释放分配的数组。
即调用operator delete []时,动态存储期的数组会被销毁。或者当程序执行完毕时,内存将被释放。