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

时间:2014-07-28 18:16:16

标签: c++ arrays memory-management

我想释放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;
}

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

2 个答案:

答案 0 :(得分:3)

不,数组在堆栈上,您无法使用delete

释放它
delete [] ListNodes;

释放未分配的内存(或释放该位置的其他对象)为undefined behavior

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

我建议阅读heap and stack here之间的差异。

答案 1 :(得分:3)

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

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