如何使用静态数组释放内存?

Posted

技术标签:

【中文标题】如何使用静态数组释放内存?【英文标题】:How do I free up memory with a static array? 【发布时间】:2014-07-28 18:16:16 【问题描述】:

我想释放 structNode 类型指针数组的内存。

struct structNode

    int value;

typedef structNode * Node;

int main()

    Node ListNodes[1000];

    //Fill and Clear the array 100 times.
    for(int j=0; j<100; j++)
    
        //Add a pointers to the array
        for(int i = 0; i < 1000; i++)
        
            Node newNode = new structNode;
            newNode->value = 3;
            ListNodes[i] = newNode;         
        

        // Deleting each pointer
        for(int i = 0; i < 1000; i++)
        
            delete ListNodes[i]; 
        
        // delete the array
        delete [] ListNodes;
    
    return 0;

这是清除每个循环中的内存的正确方法吗? 我问这个问题是因为我在使用任务管理器运行程序时会观察它,它只会增加内存使用量,而不是将内存使用量保持在恒定范围内。

【问题讨论】:

您的代码中没有任何内容是static Node ListNodes[1000]这行怎么样? ? 我在该行中没有看到 static 关键字。这是自动的。 【参考方案1】:

通常在分配函数退出之前,您无法回收为堆栈上的自动变量分配的内存,因此只有包含在静态数组中的指针才能在它们上调用delete。由于main 直到程序的生命周期结束才会退出,所以ListNodes 使用的内存占用的生命周期将与程序的生命周期相匹配。

此外,使用主机操作系统任务管理器来检查整体内存使用情况也不是一个好工具,因为在您在堆存储上调用 delete 后,主机操作系统可能仍会为您的应用程序申请内存,以避免不得不不断去主机操作系统进行额外的堆存储内存分配。去主机操作系统进行内存分配很昂贵...

【讨论】:

【参考方案2】:

不,该数组在堆栈上,您无法使用 delete 释放它:

delete [] ListNodes;

释放未分配的内存(或在该位置释放不同的对象)是undefined behavior。

不需要删除该内存,并且您不能(没有可怕的低级黑客)删除堆栈内存。如果这被证明是一个问题,请减少堆栈分配的内存量并选择动态分配。

我建议阅读heap and stack here 之间的区别。

【讨论】:

以上是关于如何使用静态数组释放内存?的主要内容,如果未能解决你的问题,请参考以下文章

二维数组动态开辟与释放

如何释放为数组分配的内存?

如何释放动态结构数组的内存

如何释放作为更大数组一部分的子数组的内存

C语言申请内存?

怎么用new定义一个类数组,并且释放内存