是否使用等于free的NULL值初始化内存块?

时间:2011-07-18 11:38:32

标签: c++ c memory-management

假设我有一个指针* p,它指向堆上的10个内存块。现在,我用NULL(或'\ 0')手动清除它,而不是free()它:

for (int i = 0; i < length; ++i{
     p[i] = '\0';
}

当每个位清零时,是否认为存储块被释放?或者,我必须使用free()告诉操作系统内存块是否真正被释放并且可用(我猜)?

7 个答案:

答案 0 :(得分:5)

必须致电free()才能将内存返回给操作系统。

一个用零填充的内存块不会比一个满了一个块的内存块“免费”。

例如,考虑仅由黑色像素组成的位图。在大多数格式中,相关的内存块将用零填充。这是否意味着可以重复使用块?

答案 1 :(得分:4)

只要你没有free内存块,它仍然是保留的。因此,要取消分配一块内存(并使其可用于其他用途),您需要调用free

将存储器块清零并不影响该存储器块的已分配状态 - 仅限于其内容。

答案 2 :(得分:4)

操作系统在堆中有数据结构,用于跟踪分配的内容和位置。使用malloc和free更新这些结构,您无法手动完成。如果只是将内存内容归零,则会泄漏内存。

答案 3 :(得分:2)

这不是释放内存。这肯定是泄密。

答案 4 :(得分:1)

  

当每个位清零时,是否认为存储区被释放?

没有。它只是一个以零作为内容的内存块。

  

我必须使用free()告诉操作系统内存块是否真正被释放并且可用(我猜)?

这取决于。如果您使用malloccalloc(或明确说明其他功能,例如strdup)分配了阻止,则需要致电free()。如果您使用newnew[]分配了该块,则需要分别使用deletedelete[]来解除分配。

答案 5 :(得分:0)

在您明确释放(通常为free()delete / [])之前,您在堆上分配的内存将保持分配状态。你在循环中所做的只是使用内存,通过向其写入数据。

答案 6 :(得分:0)

指针中的NULL值具有重要性,但不作为内存地址中的值。将分配的内存块分配为零对内存分配没有影响。您必须释放内存块明确返回操作系统。 (进程堆)

但是,当程序终止时,分配给程序的内存将返回到操作系统。 (除非你的程序使用共享内存或驱动程序的内存)

同时,不释放内存可能会因内存不足而导致程序无法终止。

Shash316