c++ - 使用新运算符时的数组生命周期

标签 c++ memory-leaks heap local-variables

考虑一下代码(它没有任何意义):

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/

相关文章:

java - 如何判断堆转储中字符串与 char[] 的比率是否表明存在问题?

memory-leaks - Xamarin.Forms 样式导致 WeakReference 泄漏

python - 基于数组的 MinHeap

c++ - SWIG Lua : Extending (%extend) class with %native. 是否可以添加 %native 方法?

c++ - 默认值的函数模​​板

c++ - 整数作为 C++ 中的条件 +'s ":? "operator

jquery - 关于 jquery、闭包和可能的内存泄漏

jvm - 永久代是堆的一部分还是在 jvm 中位于自身的不同空间

c++ - 哪个数据结构在附加重复项时提供替换操作?

c++ - 使用 C++ 在 Mac OS X 上编写 GUI 应用程序