我正在学习考试,我想知道这些是否等同于免费(ptr):
malloc(NULL);
calloc(ptr);
realloc(NULL, ptr);
calloc(ptr, 0);
realloc(ptr, 0);
根据我的理解,这些都不会起作用,因为free()函数实际上告诉C ptr后面的内存再次可供它使用。对不起,这是一个noob问题,但是将不胜感激。
答案 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的手册页同意Mitch和Jonathan ...... 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
),但是某些并且有一些防护装置就位。把它拿走它的价值。