blu*_*ral 5 c memory allocation dynamic
我正在研究测试,我想知道这些是否等同于免费(ptr):
malloc(NULL);
calloc(ptr);
realloc(NULL, ptr);
calloc(ptr, 0);
realloc(ptr, 0);
Run Code Online (Sandbox Code Playgroud)
根据我的理解,这些都不会起作用,因为free()函数实际上告诉C ptr后面的内存再次可供它使用.对不起,这是一个noob问题,但是将不胜感激.
Jon*_*ler 14
实际上,最后一个相当于打电话给free().realloc()仔细阅读规范,你会发现它可以重新分配数据,或者改变分配的大小(特别是如果新的大小比旧的大,可能会移动数据),它可以释放内存太.实际上,你不需要其他功能; 他们都可以写成realloc().并不是说心智正常的人会这样做......但是可以做到.
请参阅Steve Maguire的" 编写固体代码 ",以全面剖析malloc()功能族的危险.请参阅ACCU网站,以全面剖析阅读"编写固体代码"的危险.我不相信它会像评论那样糟糕 - 虽然它完全缺乏对待的const确定日期(回到90年代早期,当时C89仍然是新的并且没有全面实施).
D McKee关于MacOS X 10.5(BSD)的笔记很有意思......
C99标准说:
概要
#include <stdlib.h>
void *malloc(size_t size);
Run Code Online (Sandbox Code Playgroud)
描述
malloc函数为一个对象分配空间,该对象的大小由size指定,其值是不确定的.
返回
malloc函数返回空指针或指向已分配空间的指针.
概要
#include <stdlib.h>
void *realloc(void *ptr, size_t size);
Run Code Online (Sandbox Code Playgroud)
描述
realloc函数释放ptr指向的旧对象,并返回指向具有size指定大小的新对象的指针.新对象的内容应与解除分配之前的旧对象的内容相同,直到新旧大小中的较小者为止.新对象中超出旧对象大小的任何字节都具有不确定的值.
如果ptr是空指针,则realloc函数的行为类似于指定大小的malloc函数.否则,如果ptr与之前由calloc,malloc或realloc函数返回的指针不匹配,或者如果通过调用free或realloc函数释放了空间,则行为未定义.如果无法分配新对象的内存,则不会释放旧对象,并且其值不会更改.
返回
realloc函数返回指向新对象的指针(可能与指向旧对象的指针具有相同的值),如果无法分配新对象,则返回空指针.
除了由于额外的标题和功能而进行的编辑更改之外,ISO/IEC 9899:2011标准与C99相同,但在7.22.3而不是7.20.3中.
realloc的Solaris 10(SPARC)手册页说:
realloc()函数将块指针的大小更改为ptr to size bytes,并返回指向(可能已移动)块的指针.内容将保持不变,直至新旧尺寸中的较小者.如果块的新大小需要移动块,则释放用于块的先前实例化的空间.如果新大小较大,则未指定块的新分配部分的内容.如果ptr为NULL,则realloc()的行为类似于指定大小的malloc().如果size为0且ptr不是空指针,则释放指向的空间.
这是一个非常明确的'它就像free()'声明一样.
但是,MacOS X 10.5或者BSD说不同的东西再次证实了我的第一段中"他们正确的思想中没有人"的一部分.
当然,还有C99理由 ......它说:
在这些函数的定义中处理空指针和零长度分配请求部分是由支持这种范例的愿望指导的:
OBJ * p; // pointer to a variable list of OBJs
/* initial allocation */
p = (OBJ *) calloc(0, sizeof(OBJ));
/* ... */
/* reallocations until size settles */
while(1) {
p = (OBJ *) realloc((void *)p, c * sizeof(OBJ));
/* change value of c or break out of loop */
}
Run Code Online (Sandbox Code Playgroud)
据报道,这种编码方式未得到委员会的认可,因此得到广泛使用.
某些实现已为零字节的分配请求返回了非空值.虽然这种策略具有区分"无"和"零"(未分配指针与指向零长度空间的指针)的理论优势,但它具有更迫切的理论缺点,即需要零长度对象的概念.由于无法声明此类对象,因此它们可能存在的唯一方法是通过此类分配请求.
C89委员会决定不接受零长度物体的想法.因此,分配函数可以返回零指针分配请求的空指针.请注意,这种处理方法并不排除上述范例.
C89的安静改变
依赖于返回非空指针的大小为零的分配请求的程序将表现不同.
[...]
null第一个参数是允许的.如果第一个参数不为null,并且第二个参数为0,则调用将释放第一个参数指向的内存,并且可能返回null参数; C99与不允许零大小对象的策略一致.
C99的一个新功能:更改了realloc函数,以清楚地指出了指向的对象被释放,分配了一个新对象,并且新对象的内容与旧对象的内容相同,直到较小的对象这两种尺寸.C89尝试指定新对象与旧对象是同一对象,但可能具有不同的地址.这与标准的其他部分冲突,这些部分假定对象的地址在其生命周期内是恒定的.此外,当大小为零时,支持实际分配的实现不一定为此情况返回空指针.C89似乎要求零回报值,委员会认为这个限制性太强.
C89明确地说:"如果size为零且ptr不是空指针,则它指向的对象被释放." 所以他们似乎已经删除了C99中的那个句子?
是的,他们删除了这句话,因为它被开头的句子包含在内:
realloc函数释放ptr指向的旧对象
那里没有蠕动的空间; 旧对象被释放.如果请求的大小为零,那么你可以返回任何malloc(0)可能返回的内容,这通常(通常)是一个空指针,但可能是一个非空指针,也可以返回free()但不能合法地解除引用.
| 归档时间: |
|
| 查看次数: |
2538 次 |
| 最近记录: |