我想释放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;
}
这是清除每个角色内存的正确方法吗? 我问这个问题是因为我在使用任务管理器运行时观察程序,它只增加内存使用量而不是将内存使用量保持在一个恒定范围内。
答案 0 :(得分:3)
不,数组在堆栈上,您无法使用delete
:
delete [] ListNodes;
释放未分配的内存(或释放该位置的其他对象)为undefined behavior。
无需删除该内存,您不能(没有可怕的低级别黑客)删除堆栈内存。如果这证明是一个问题,减少堆栈分配的内存量,并选择动态分配。
我建议阅读heap and stack here之间的差异。
答案 1 :(得分:3)
通常,在分配函数退出之前,您无法回收为堆栈上的自动变量分配的内存,因此只有静态数组中包含的指针才能调用delete
。由于main
在程序生命周期完成之前不会退出,因此ListNodes
使用的内存占用的生命周期将与程序的生命周期相匹配。
同样使用主机操作系统任务管理器来检查总体内存使用情况并不是一个好工具,因为主机操作系统可能仍然会在您的堆存储上调用delete
之后为您的应用程序申请内存避免不得不经常去主机操作系统进行额外的堆存储内存分配。去主机操作系统进行内存分配是很昂贵的......