有没有另一种方法可以在C中释放动态分配的内存 - 不使用free()函数?

时间:2009-04-15 02:15:40

标签: c memory dynamic allocation

我正在学习考试,我想知道这些是否等同于免费(ptr):

 malloc(NULL); 

 calloc(ptr); 

 realloc(NULL, ptr); 

 calloc(ptr, 0); 

 realloc(ptr, 0);

根据我的理解,这些都不会起作用,因为free()函数实际上告诉C ptr后面的内存再次可供它使用。对不起,这是一个noob问题,但是将不胜感激。

3 个答案:

答案 0 :(得分:14)

答案 1 :(得分:4)

realloc(ptr, 0);

相当于free(ptr);(虽然我不推荐使用它!)

另外:这两个电话相互等同(但不是免费的):

realloc(NULL,size)
malloc(size)

答案 2 :(得分:0)

最后一个 - realloc(ptr, 0) - 接近尾声。它将释放任何已分配的块并用最小的分配替换它(我的Mac OS X 10.5联机帮助页)。请查看您当地的联机帮助页,了解它在您的系统上的作用。

也就是说,如果ptr指向一个实体对象,你将会收回大部分内存。


Debian Lenny的手册页同意MitchJonathan ...... BSD真的与Linux有分歧吗?


来自违规手册页:

  

realloc()函数尝试更改指向的分配大小        通过ptr来调整大小,然后返回ptr。 [...]        如果size为零且ptr不为NULL,则为new,        分配最小尺寸的对象并释放原始对象。


linux和solaris手册页非常干净,'89标准:realloc(ptr,0)的工作方式与free(ptr)类似。上面的Mac OS手册页和Jonathan引用的标准不太清楚,但似乎留下了打破等价的空间。

我一直在想为什么差异:对我来说,“自由行为”的解释似乎很自然。我可以访问的两个实现包括一些环境变量驱动的可调性,但BSD版本接受更多选项一些例子:

 MallocGuardEdges             If set, add a guard page before and after
                              each large block.  
 MallocDoNotProtectPrelude    If set, do not add a guard page before large
                              blocks, even if the MallocGuardEdges envi-
                              ronment variable is set.

 MallocDoNotProtectPostlude   If set, do not add a guard page after large
                              blocks, even if the MallocGuardEdges envi-
                              ronment variable is set.

 MallocPreScribble            If set, fill memory that has been allocated
                              with 0xaa bytes.  This increases the likeli-
                              hood that a program making assumptions about
                              the contents of freshly allocated memory
                              will fail.
 MallocScribble               If set, fill memory that has been deallo-
                              cated with 0x55 bytes.  This increases the
                              likelihood that a program will fail due to
                              accessing memory that is no longer allo-
                              cated.

在正常模式下,“最小尺寸的物体”可能不是(即相当于free),但是某些并且有一些防护装置就位。把它拿走它的价值。