假设我有一个指针* p,它指向堆上的10个内存块。现在,我用NULL(或'\ 0')手动清除它,而不是free()它:
for (int i = 0; i < length; ++i{
p[i] = '\0';
}
当每个位清零时,是否认为存储块被释放?或者,我必须使用free()告诉操作系统内存块是否真正被释放并且可用(我猜)?
答案 0 :(得分:5)
你做必须致电free()
才能将内存返回给操作系统。
一个用零填充的内存块不会比一个满了一个块的内存块“免费”。
例如,考虑仅由黑色像素组成的位图。在大多数格式中,相关的内存块将用零填充。这是否意味着可以重复使用块?
答案 1 :(得分:4)
只要你没有free
内存块,它仍然是保留的。因此,要取消分配一块内存(并使其可用于其他用途),您需要调用free
。
答案 2 :(得分:4)
操作系统在堆中有数据结构,用于跟踪分配的内容和位置。使用malloc和free更新这些结构,您无法手动完成。如果只是将内存内容归零,则会泄漏内存。
答案 3 :(得分:2)
这不是释放内存。这肯定是泄密。
答案 4 :(得分:1)
当每个位清零时,是否认为存储区被释放?
没有。它只是一个以零作为内容的内存块。
我必须使用free()告诉操作系统内存块是否真正被释放并且可用(我猜)?
这取决于。如果您使用malloc
或calloc
(或明确说明其他功能,例如strdup
)分配了阻止,则需要致电free()
。如果您使用new
或new[]
分配了该块,则需要分别使用delete
或delete[]
来解除分配。
答案 5 :(得分:0)
在您明确释放(通常为free()
或delete
/ []
)之前,您在堆上分配的内存将保持分配状态。你在循环中所做的只是使用内存,通过向其写入数据。
答案 6 :(得分:0)
指针中的NULL值具有重要性,但不作为内存地址中的值。将分配的内存块分配为零对内存分配没有影响。您必须释放内存块明确返回操作系统。 (进程堆)
但是,当程序终止时,分配给程序的内存将返回到操作系统。 (除非你的程序使用共享内存或驱动程序的内存)
同时,不释放内存可能会因内存不足而导致程序无法终止。
Shash316